Spaces:
No application file
No application file
| import logging | |
| from app.config import settings | |
| class ExtraFormatter(logging.Formatter): | |
| """Custom formatter that includes extra fields""" | |
| def format(self, record): | |
| # Get the basic formatted message | |
| formatted = super().format(record) | |
| # Add extra fields if they exist | |
| if hasattr(record, '__dict__'): | |
| extra_fields = {} | |
| for key, value in record.__dict__.items(): | |
| # Skip standard logging fields | |
| if key not in ['name', 'msg', 'args', 'levelname', 'levelno', 'pathname', | |
| 'filename', 'module', 'exc_info', 'exc_text', 'stack_info', | |
| 'lineno', 'funcName', 'created', 'msecs', 'relativeCreated', | |
| 'thread', 'threadName', 'processName', 'process', 'message', | |
| 'asctime']: | |
| extra_fields[key] = value | |
| if extra_fields: | |
| extra_str = " | ".join([f"{k}={v}" for k, v in extra_fields.items()]) | |
| formatted = f"{formatted} | {extra_str}" | |
| return formatted | |
| def setup_logger() -> logging.Logger: | |
| """Setup logging configuration using standard logging""" | |
| logger = logging.getLogger("app") | |
| # can add different log levels, one global, then separate for file and stream | |
| stream_handler = logging.StreamHandler() | |
| file_handler = logging.FileHandler(settings.log_filename, mode="w") | |
| formatter = ExtraFormatter( | |
| fmt="%(asctime)s | %(filename)s:%(lineno)d | %(levelname)s | %(name)s | %(message)s" | |
| ) | |
| logger.setLevel(settings.log_level) | |
| stream_handler.setFormatter(formatter) | |
| stream_handler.setLevel(settings.log_level) | |
| file_handler.setFormatter(formatter) | |
| file_handler.setLevel(settings.log_level) | |
| logger.addHandler(stream_handler) | |
| logger.addHandler(file_handler) | |
| return logger | |
| logger = setup_logger() | |