Source code for pyscoundrel.logging.logger

"""Game event logger."""

from pathlib import Path
from typing import Any, Dict, Optional, TextIO

from .events import GameEvent, create_event
from .formatters import JSONFormatter, TextFormatter


[docs] class GameLogger: """Logger for game events.""" def __init__(self, log_file: Optional[Path] = None, log_console: bool = False): """ Initialize logger. Args: log_file: Path to log file (JSON format) log_console: Whether to log to console (text format) """ self.log_file = log_file self.log_console = log_console self.json_formatter = JSONFormatter() self.text_formatter = TextFormatter() self._file_handle: Optional[TextIO] = None # Open log file if specified if self.log_file: self.log_file.parent.mkdir(parents=True, exist_ok=True) self._file_handle = open(self.log_file, "w")
[docs] def log_event(self, event: GameEvent) -> None: """Log an event.""" # Write to file (JSON) if self._file_handle: json_line = self.json_formatter.format(event) self._file_handle.write(json_line + "\n") self._file_handle.flush() # Write to console (text) if self.log_console: text_line = self.text_formatter.format(event) print(text_line)
[docs] def log( self, event_type: str, data: Dict[str, Any], state: Optional[Dict[str, Any]] = None ) -> None: """Create and log an event.""" event = create_event(event_type, data, state) self.log_event(event)
[docs] def close(self) -> None: """Close log file.""" if self._file_handle: self._file_handle.close() self._file_handle = None
def __enter__(self): """Context manager entry.""" return self def __exit__(self, _exc_type, _exc_val, _exc_tb): """Context manager exit.""" self.close()