# 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:

```php
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:

```php
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:

```php
#[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:

```php
#[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

```php
// 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

```php
// 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
