PHP_AdminTool_Projekt/app/Controllers/LogViewerController.php
blaerf 9f0e534e20 develop (#28)
Co-authored-by: tg95 <tg95@noreply.localhost>
Co-authored-by: Taarly <lownslow.music@gmail.com>
Co-authored-by: taarly <lownslow.music@gmail.com>
Co-authored-by: ViperioN1339 <stezel1989@outlook.de>
Co-authored-by: MuchenTuchen31 <yasin.mine31@gmail.com>
Reviewed-on: https://git.eckertplayground.de/taarly/PHP_AdminTool_Projekt/pulls/28
Co-authored-by: blaerf <blaerf@gmx.de>
Co-committed-by: blaerf <blaerf@gmx.de>
2025-12-17 14:28:04 +00:00

124 lines
3.3 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Controllers;
use App\Services\Logging\LoggingService;
use App\Services\Logging\LogViewerService;
/**
* Controller für den Log Viewer (read-only).
*/
class LogViewerController
{
/** @var array<string, mixed> */
private array $config;
private LoggingService $logger;
private LogViewerService $logViewer;
/**
* @param array<string, mixed> $config
*/
public function __construct(array $config)
{
$this->config = $config;
$loggingConfig = $config['logging'] ?? [];
$this->logger = new LoggingService($loggingConfig);
$this->logViewer = new LogViewerService($loggingConfig);
}
/**
* Zeigt den Log Viewer an.
*
* Erwartet optionale GET-Parameter:
* - file (Dateiname, z.B. app.log)
* - level (DEBUG|INFO|WARNING|ERROR)
* - q (Suche)
* - lines (Anzahl Zeilen, Default 200)
*
* @return array<string, mixed>
*/
public function show(): array
{
$files = $this->logViewer->listLogFiles();
$selectedFile = (string)($_GET['file'] ?? '');
if ($selectedFile === '' && isset($files[0]['name'])) {
$selectedFile = (string)$files[0]['name'];
}
$level = (string)($_GET['level'] ?? '');
$level = strtoupper(trim($level));
if ($level === '') {
$level = '';
}
$q = (string)($_GET['q'] ?? '');
$q = trim($q);
$lines = (int)($_GET['lines'] ?? 200);
if ($lines <= 0) {
$lines = 200;
}
if ($lines > 2000) {
$lines = 2000;
}
$error = null;
$fileMeta = null;
$entries = [];
try {
if ($selectedFile !== '') {
$fileMeta = $this->logViewer->getFileMeta($selectedFile);
$entries = $this->logViewer->getEntries(
$selectedFile,
$lines,
$level !== '' ? $level : null,
$q !== '' ? $q : null
);
if ($fileMeta === null) {
$error = 'Die ausgewählte Log-Datei ist nicht verfügbar.';
$entries = [];
}
} else {
$error = 'Es wurde keine Log-Datei gefunden.';
}
} catch (\Throwable $ex) {
$this->logger->logException(
'LogViewerController: Fehler beim Laden der Logs.',
$ex,
[
'route' => 'logs',
'file' => $selectedFile,
]
);
$error = 'Technischer Fehler beim Laden der Logs. Details stehen im app.log.';
}
$viewPath = __DIR__ . '/../../public/views/logs.php';
return [
'view' => $viewPath,
'data' => [
'loginPage' => false,
'files' => $files,
'selectedFile' => $selectedFile,
'fileMeta' => $fileMeta,
'entries' => $entries,
'filterLevel' => $level,
'searchQuery' => $q,
'lines' => $lines,
'error' => $error,
],
'pageTitle' => 'Logs',
'activeMenu' => 'logs',
];
}
}