(self, name: str, log_level: LogLevel = LogLevel.INFO, log_file: str = None)
| 27 | """A structured logger that outputs JSON format logs with consistent fields.""" |
| 28 | |
| 29 | def __init__(self, name: str, log_level: LogLevel = LogLevel.INFO, log_file: str = None): |
| 30 | self.name = name |
| 31 | self.log_level = log_level |
| 32 | self.logger = logging.getLogger(name) |
| 33 | self.logger.setLevel(self._get_logging_level(log_level)) |
| 34 | |
| 35 | # Create formatter |
| 36 | formatter = logging.Formatter('%(message)s') |
| 37 | |
| 38 | # Create handler |
| 39 | if log_file: |
| 40 | # Ensure log directory exists |
| 41 | log_path = Path(log_file) |
| 42 | log_path.parent.mkdir(parents=True, exist_ok=True) |
| 43 | handler = logging.FileHandler(log_file) |
| 44 | else: |
| 45 | handler = logging.StreamHandler(sys.stdout) |
| 46 | |
| 47 | handler.setFormatter(formatter) |
| 48 | self.logger.addHandler(handler) |
| 49 | |
| 50 | # For correlation IDs |
| 51 | self.correlation_id = None |
| 52 | |
| 53 | def _get_logging_level(self, log_level: LogLevel) -> int: |
| 54 | """Convert LogLevel enum to logging module level.""" |
nothing calls this directly
no test coverage detected