Logging System
Developer guide for using the logging system in Open Ticket AI with abstract interfaces and dependency injection.
Logging System
Open Ticket AI verwendet eine abstrakte Logging-Interface, die Entwickler ermöglicht, das Logging-Verhalten zu konfigurieren, ohne den Anwendungscode zu ändern. Die aktuelle Implementierung basiert vollständig auf Python’s Standardbibliothek logging Modul.
Übersicht
Das Logging-System bietet:
- Abstrakte Interfaces:
AppLoggerundLoggerFactoryProtokolle - Standardbibliothek-Implementierung:
StdlibLoggerFactory - Dependency Injection:
AppModulestelltLoggerFactoryfür automatische Setup bereit - Kontext-Bindung: Strukturierten Kontext zu Log-Messages anhängen mit der Logger API
Schnellstart
Verwenden mit Dependency Injection
Services können die LoggerFactory injizieren und verwenden, um Loggers mit gebundenem Kontext zu erstellen. Die Factory gibt Instanzen von StdlibLogger zurück, die zu logging.getLogger proxy.
Direkte Nutzung (ohne DI)
Der Standardbibliothek-Adapter kann direkt konfiguriert und verwendet werden, ohne den Dependency Injection Container. Konfigurieren Sie das Logging-System beim Anwendungsstart und erstellen Sie Loggers wie benötigt.
from open_ticket_ai.core.logging.logging_models import LoggingConfig
from open_ticket_ai.core.logging.stdlib_logging_adapter import (
StdlibLoggerFactory,
create_logger_factory,
)
config = LoggingConfig(level="INFO")
factory = create_logger_factory(config)
logger = factory.create("my_module")
logger.info("Application started")
Konfiguration
Runtime Konfiguration
Das Logging-System wird durch die Anwendung’s YAML Konfigurationsdatei unter dem infrastructure.logging Abschnitt konfiguriert, welcher durch das AppModule während des Dependency Injection Setup geladen wird.
LoggingConfig Felder
LoggingConfig definiert die unterstützte Runtime Konfiguration:
| Feld | Typ | Default | Beschreibung |
|---|---|---|---|
level | Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] | "INFO" | Minimum Severity Level, welches von Handlers aufgezeichnet wird. |
log_to_file | bool | False | Aktiviert das Schreiben von Log-Output zu einem File Handler. |
log_file_path | str | None | None | Absolute oder relative Pfad für File Logging. Erforderlich wenn log_to_file True ist. |
format.message_format | str | "%(asctime)s - %(name)s - %(levelname)s - %(message)s" | Format String, welcher zu logging.Formatter gegeben wird. |
format.date_format | str | "%Y-%m-%d %H:%M:%S" | Timestamp Format, welcher vom Formatter verwendet wird. |
Logging Implementierung
Stdlib (Python Standardbibliothek)
Der Standardbibliothek-Adapter wrappt Python’s eingebautes logging Modul.
Features:
- Bekannte API für Python Entwickler
- Kompatibel mit existierenden Logging Konfigurationen
- Respektiert die
LoggingConfigOptionen für Format, Level und optionalen File Output
Beispiel Output:
2025-10-11 00:21:14 - my_module - INFO - Application started
Handler Wiring
create_logger_factory bereitet den globalen Logging State vor:
- Hole den Root Logger und setze sein Level von
LoggingConfig.level. - Entferne alle vorher registrierten Handlers, um duplicate Messages zu vermeiden.
- Erstelle einen
logging.Formattermitlog_formatunddate_format. - Füge einen
StreamHandlerhinzu, welcher zusys.stdoutschreibt, konfiguriert mit dem gewählten Level und Formatter. - Optional füge einen
FileHandlerhinzu, wennlog_to_fileTrueist undlog_file_pathgegeben ist. - Gib eine
StdlibLoggerFactoryzurück, welcheStdlibLoggerInstanzen erstellt, gebunden zu named Loggers.
Kontext Bindung
Kontext Bindung ermöglicht Ihnen, strukturierte Daten zu Log-Messages anzuhängen. Erstellen Sie einen Base Logger mit Service Kontext, dann binden Sie request-spezifischen Kontext. Alle folgenden Log-Messages von diesem Logger werden den gebunden Kontext automatisch enthalten.
Logger Methoden
Das AppLogger Protokoll definiert die folgenden Methoden:
- **
bind(**kwargs)**: Erstellen einen neuen Logger mit zusätzlichen Kontext - **
debug(message, **kwargs)**: Log Debug Information - **
info(message, **kwargs)**: Log Informational Messages - **
warning(message, **kwargs)**: Log Warnings - **
error(message, **kwargs)**: Log Errors - **
exception(message, **kwargs)**: Log Exceptions mit Traceback
Best Practices
1. Verwenden Dependency Injection
Injizieren Sie immer die LoggerFactory statt Loggers direkt zu erstellen. Dies ermöglicht einfachere Testing und Konfigurationsmanagement.
2. Bind Kontext früh
Erstellen Sie scoped Loggers mit gebunden Kontext für besser Traceability. Bind Kontext Daten wie Request IDs, User IDs oder Operation Namen früh, sodass alle folgenden Logs diese Information enthalten.
3. Verwenden angemessene Log Levels
- DEBUG: Detailierte Diagnose Information
- INFO: Allgemeine Informational Messages
- WARNING: Warning Messages für potentiell schädliche Situationen
- ERROR: Error Events, welche die App möglicherweise weiterlaufen lassen
- EXCEPTION: Wie ERROR aber beinhaltet Exception Traceback
4. Beinhalten relevanten Kontext
Fügen Sie Kontext hinzu, welches hilft mit Debugging und Monitoring, wie:
- Query Execution Time
- Anzahl von rows affected
- Table oder Resource Namen
- Operation Identifiers
5. Log nicht sensitive Daten
Log niemals Passwörter, Tokens oder persönliche Information. Log immer Identifiers statt sensitive Werte.
Testing mit Logging
Wenn Sie Tests schreiben, können Sie Logging Behavior verifizieren, indem Sie Log Output capture und auf die Messages und Kontext Daten assert.
Migration Guide
Von direkt logging.getLogger()
Ersetzen Sie direkte Nutzung von Python’s Logging Modul mit Dependency Injection der LoggerFactory. Dies ermöglicht, die Logging Implementierung zu swap ohne Code Änderungen.
Von AppConfig.get_logger()
Ersetzen Sie Nutzungen von legacy Factory Helpers mit Dependency-Injected Instanzen von LoggerFactory erstellt durch create_logger_factory.
Future Roadmap
Die Logging Abstraktion ermöglicht, alternative Adapters (wie Structlog oder OpenTelemetry Exporters) in der Zukunft einzuführen. Diese Integrations sind aktuell unter Evaluation und noch nicht verfügbar. Diese Seite wird updated, wenn neue Implementations hinzugefügt werden, sodass Leser sie confidently adoptieren können.
