|
4 | 4 | from functools import cache |
5 | 5 | from typing import Any, NewType |
6 | 6 |
|
| 7 | +from pythonjsonlogger.json import JsonFormatter |
7 | 8 | from yarl import URL |
8 | 9 |
|
9 | 10 | from eligibility_signposting_api.contextvars_manager import request_id_var |
@@ -59,21 +60,21 @@ def config() -> dict[str, Any]: |
59 | 60 | } |
60 | 61 |
|
61 | 62 |
|
62 | | -class LoggingJsonFormatter(logging.Formatter): |
63 | | - def format(self, record: logging.LogRecord) -> str: |
64 | | - # Insert request_id from contextvar for every log record |
65 | | - record.request_id = request_id_var.get() or "-" |
66 | | - return super().format(record) |
| 63 | +class EnrichedJsonFormatter(JsonFormatter): |
| 64 | + def add_fields(self, log_record: dict[str, Any], record: logging.LogRecord, message_dict: dict[str, Any]) -> None: |
| 65 | + super().add_fields(log_record, record, message_dict) |
| 66 | + log_record["request_id"] = request_id_var.get() or "-" |
67 | 67 |
|
68 | 68 |
|
69 | 69 | def init_logging(quieten: Sequence[str] = ("asyncio", "botocore", "boto3", "mangum", "urllib3")) -> None: |
70 | | - log_format = "%(asctime)s %(levelname)-8s %(name)s %(module)s.py:%(funcName)s():%(lineno)d %(message)s" |
71 | | - formatter = LoggingJsonFormatter(log_format) |
| 70 | + log_format = "%(asctime)s %(levelname)s %(name)s %(module)s %(funcName)s %(lineno)d %(message)s" |
| 71 | + formatter = EnrichedJsonFormatter(log_format) |
72 | 72 | handler = logging.StreamHandler() |
73 | 73 | handler.setFormatter(formatter) |
74 | | - logging.root.handlers = [] # Clear any existing handlers |
75 | | - logging.root.setLevel(LOG_LEVEL) # Set log level |
76 | | - logging.root.addHandler(handler) # Add handler |
| 74 | + |
| 75 | + logging.root.handlers = [] # Remove default handlers |
| 76 | + logging.root.setLevel(LOG_LEVEL) |
| 77 | + logging.root.addHandler(handler) |
77 | 78 |
|
78 | 79 | for q in quieten: |
79 | 80 | logging.getLogger(q).setLevel(logging.WARNING) |
0 commit comments