Files
michaelschiemer/docs/logging-module.md
Michael Schiemer 55a330b223 Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug
- Add DISCOVERY_SHOW_PROGRESS=true
- Temporary changes for debugging InitializerProcessor fixes on production
2025-08-11 20:13:26 +02:00

4.9 KiB

Logging-Modul Dokumentation

Übersicht

Das Logging-Modul wurde überarbeitet, um eine konsistente Pfadverwaltung zu gewährleisten und die Konfiguration zu zentralisieren. Die Hauptverbesserungen umfassen:

  1. Zentrale Konfiguration für Logpfade mit LogConfig
  2. Integration des PathProvider für konsistente Pfadauflösung
  3. Einheitliche Verzeichnisstruktur für verschiedene Logtypen
  4. Automatische Erstellung von Logverzeichnissen

Komponenten

LogConfig

Die neue LogConfig-Klasse dient als zentrale Konfiguration für alle Logpfade:

final class LogConfig
{
    public function __construct(PathProvider $pathProvider)
    {
        // Initialisierung der Logpfade
    }
    
    public function getLogPath(string $type): string
    {
        // Gibt den Pfad für einen bestimmten Log-Typ zurück
    }
    
    public function getAllLogPaths(): array
    {
        // Gibt alle konfigurierten Logpfade zurück
    }
    
    public function ensureLogDirectoriesExist(): void
    {
        // Stellt sicher, dass alle Logverzeichnisse existieren
    }
}

FileHandler und JsonFileHandler

Die Handler wurden aktualisiert, um den PathProvider zu verwenden:

public function __construct(
    string $logFile,
    LogLevel|int $minLevel = LogLevel::DEBUG,
    string $outputFormat = '[{timestamp}] [{level_name}] {request_id}{channel}{message}',
    int $fileMode = 0644,
    ?LogRotator $rotator = null,
    ?PathProvider $pathProvider = null
) {
    // Pfad auflösen, falls PathProvider vorhanden
    if ($this->pathProvider !== null && !str_starts_with($logFile, '/')) {
        $logFile = $this->pathProvider->resolvePath($logFile);
    }
    
    // ...
}

LoggerInitializer

Der LoggerInitializer wurde aktualisiert, um PathProvider und LogConfig zu verwenden:

#[Initializer]
public function __invoke(TypedConfiguration $config, PathProvider $pathProvider): Logger
{
    // Erstelle LogConfig für zentrale Pfadverwaltung
    $logConfig = new LogConfig($pathProvider);
    
    // Stelle sicher, dass alle Logverzeichnisse existieren
    $logConfig->ensureLogDirectoriesExist();
    
    // ...
    
    $handlers[] = new FileHandler(
        $logConfig->getLogPath('app'),
        $minLevel,
        '[{timestamp}] [{level_name}] {request_id}{channel}{message}',
        0644,
        null,
        $pathProvider
    );
    
    // ...
}

LogViewerInitializer

Der LogViewerInitializer wurde aktualisiert, um PathProvider und LogConfig zu verwenden:

#[Initializer]
public function __invoke(PathProvider $pathProvider): LogViewer
{
    // Erstelle LogConfig für zentrale Pfadverwaltung
    $logConfig = new LogConfig($pathProvider);
    
    // Stelle sicher, dass alle Logverzeichnisse existieren
    $logConfig->ensureLogDirectoriesExist();
    
    // Verwende die konfigurierten Logpfade aus LogConfig
    $logPaths = $logConfig->getAllLogPaths();
    
    return new LogViewer($logPaths);
}

Verzeichnisstruktur

Die Logs werden in einer einheitlichen Verzeichnisstruktur organisiert:

logs/
├── app/
│   ├── app.log
│   └── error.log
├── security/
│   └── security.log
└── debug/
    ├── framework.log
    ├── cache.log
    └── database.log

Konfiguration

Die Logpfade können über Umgebungsvariablen konfiguriert werden:

  • LOG_BASE_PATH: Basis-Verzeichnis für Logs (Standard: logs)
  • LOG_PATH: Pfad für die Haupt-Logdatei (überschreibt app.log)
  • PHP_ERROR_LOG: Pfad für PHP-Fehler (überschreibt error.log)
  • NGINX_ACCESS_LOG: Pfad für Nginx-Access-Logs
  • NGINX_ERROR_LOG: Pfad für Nginx-Error-Logs

Verwendung

Logger verwenden

// Logger wird automatisch über Dependency Injection bereitgestellt
public function __construct(Logger $logger)
{
    $this->logger = $logger;
}

public function someMethod()
{
    $this->logger->info("Eine Informationsmeldung");
    $this->logger->error("Ein Fehler ist aufgetreten", ['context' => 'additional data']);
}

LogViewer verwenden

// LogViewer wird automatisch über Dependency Injection bereitgestellt
public function __construct(LogViewer $logViewer)
{
    $this->logViewer = $logViewer;
}

public function viewLogs()
{
    // Alle verfügbaren Logs anzeigen
    $availableLogs = $this->logViewer->getAvailableLogs();
    
    // Inhalt eines bestimmten Logs abrufen
    $appLogContent = $this->logViewer->getLogContent('app');
}

Vorteile der neuen Implementierung

  1. Konsistente Pfadverwaltung: Alle Logpfade werden einheitlich über den PathProvider aufgelöst
  2. Zentrale Konfiguration: Alle Logpfade sind an einem Ort definiert und können einfach geändert werden
  3. Automatische Verzeichniserstellung: Logverzeichnisse werden automatisch erstellt, wenn sie nicht existieren
  4. Umgebungsvariablen-Support: Logpfade können über Umgebungsvariablen konfiguriert werden
  5. Strukturierte Logs: Klare Verzeichnisstruktur für verschiedene Logtypen