This commit is contained in:
2026-02-03 01:32:31 +01:00
parent 42f49f275e
commit 0668de87af
4 changed files with 52 additions and 11 deletions

View File

@@ -42,6 +42,8 @@ let debugPhpLoaded = false;
let debugPhpLoading = false;
let debugLogsLoaded = false;
let debugActiveTab = 'php';
let debugLogsRefreshTimer = null;
let debugSelectedLogName = '';
let phpInfoContainer;
let consoleContainer;
let logsListContainer;
@@ -949,6 +951,9 @@ function ensureDebugDialog() {
<div class="debug-logs-list" id="debugLogsList">Keine Logs geladen.</div>
<div class="debug-logs-detail" id="debugLogDetail">Bitte Log auswaehlen.</div>
</div>
<div class="mt-3 flex justify-end">
<button type="button" class="btn" id="debugLogsRefresh">Logs aktualisieren</button>
</div>
</div>
</div>`;
document.body.appendChild(debugDialog);
@@ -956,6 +961,7 @@ function ensureDebugDialog() {
consoleContainer = debugDialog.querySelector('#debugConsoleContent');
logsListContainer = debugDialog.querySelector('#debugLogsList');
logDetailContainer = debugDialog.querySelector('#debugLogDetail');
debugDialog.querySelector('#debugLogsRefresh')?.addEventListener('click', () => loadDebugLogs(true));
debugDialog.querySelector('[data-debug-close]')?.addEventListener('click', () => closeDebugDialog());
debugDialog.addEventListener('close', () => setDebugTab('php'));
debugDialog.querySelectorAll('[data-debug-tab]').forEach(btn => {
@@ -975,6 +981,10 @@ function openDebugDialog(tab = 'php') {
}
function closeDebugDialog() {
if (debugLogsRefreshTimer) {
clearInterval(debugLogsRefreshTimer);
debugLogsRefreshTimer = null;
}
if (debugDialog?.open) debugDialog.close();
}
@@ -993,7 +1003,19 @@ function setDebugTab(tab) {
} else if (debugActiveTab === 'console') {
renderConsolePanel();
} else if (debugActiveTab === 'logs') {
loadDebugLogs();
loadDebugLogs(true);
if (!debugLogsRefreshTimer) {
debugLogsRefreshTimer = setInterval(() => {
if (debugDialog?.open && debugActiveTab === 'logs') {
loadDebugLogs(true);
}
}, 5000);
}
} else {
if (debugLogsRefreshTimer) {
clearInterval(debugLogsRefreshTimer);
debugLogsRefreshTimer = null;
}
}
}
@@ -1033,10 +1055,12 @@ function renderConsolePanel() {
consoleContainer.innerHTML = lines.join('');
}
async function loadDebugLogs() {
if (debugLogsLoaded || !logsListContainer || !logDetailContainer) return;
async function loadDebugLogs(force = false) {
if ((!force && debugLogsLoaded) || !logsListContainer || !logDetailContainer) return;
logsListContainer.textContent = 'Lade Logs…';
logDetailContainer.textContent = 'Bitte Log auswaehlen.';
if (!debugSelectedLogName) {
logDetailContainer.textContent = 'Bitte Log auswaehlen.';
}
try {
const res = await apiAction('debug.logs.list', { method: 'GET' });
if (!res?.ok) throw new Error(res?.error || 'Logs konnten nicht geladen werden');
@@ -1047,17 +1071,31 @@ async function loadDebugLogs() {
}
logsListContainer.innerHTML = '';
items.forEach((item, idx) => {
const name = item.name || item.file || `Log ${idx + 1}`;
const btn = document.createElement('button');
btn.type = 'button';
btn.textContent = item.name || item.file || `Log ${idx + 1}`;
btn.textContent = name;
btn.addEventListener('click', () => {
logsListContainer.querySelectorAll('button').forEach(b => b.classList.remove('active'));
btn.classList.add('active');
loadDebugLogFile(item.name || item.file || '');
debugSelectedLogName = name;
loadDebugLogFile(name);
});
logsListContainer.appendChild(btn);
if (idx === 0) btn.click();
if (debugSelectedLogName && debugSelectedLogName === name) {
btn.classList.add('active');
}
});
if (!debugSelectedLogName) {
const first = logsListContainer.querySelector('button');
if (first) first.click();
} else {
const active = logsListContainer.querySelector('button.active');
if (!active) {
const first = logsListContainer.querySelector('button');
if (first) first.click();
}
}
debugLogsLoaded = true;
} catch (err) {
logsListContainer.textContent = err.message || 'Logs konnten nicht geladen werden';

View File

@@ -17,8 +17,12 @@ if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$clientIp = (string)($_SERVER['REMOTE_ADDR'] ?? '');
}
$clientIp = trim($clientIp);
$accessLine = date(DATE_ATOM) . ' | ' . ($clientIp !== '' ? $clientIp : 'unknown') . "\n";
@file_put_contents($debugDir . '/last_access.log', $accessLine);
$version = $GLOBALS['app_version'] ?? '';
$versionLabel = $version ? (' | v' . $version) : '';
$accessLine = date(DATE_ATOM) . ' | ' . ($clientIp !== '' ? $clientIp : 'unknown') . $versionLabel . "\n";
$logFile = $debugDir . '/last_access.log';
$existing = is_file($logFile) ? (string)@file_get_contents($logFile) : '';
@file_put_contents($logFile, $accessLine . $existing);
$pageTitle = 'Email Template System Admin';
$pageId = 'home';