"""Structured logging with syslog support.""" import json import logging import sys from logging.handlers import SysLogHandler from guarddog_nexus.config import config class JsonFormatter(logging.Formatter): def format(self, record: logging.LogRecord) -> str: payload = { "timestamp": self.formatTime(record, self.datefmt), "level": record.levelname, "logger": record.name, "message": record.getMessage(), } if record.exc_info and record.exc_info[1]: payload["exception"] = str(record.exc_info[1]) return json.dumps(payload, ensure_ascii=False) def setup_logging() -> logging.Logger: logger = logging.getLogger("guarddog_nexus") logger.setLevel(config.log_level.upper()) stdout_handler = logging.StreamHandler(sys.stdout) stdout_handler.setFormatter(JsonFormatter()) logger.addHandler(stdout_handler) if config.log_syslog_host: syslog_handler = SysLogHandler( address=(config.log_syslog_host, config.log_syslog_port), facility=SysLogHandler.LOG_LOCAL0, ) syslog_handler.setFormatter(JsonFormatter()) logger.addHandler(syslog_handler) return logger log = setup_logging()