22import logging
33import logging .config
44import sys
5- from datetime import datetime , timezone
5+ from datetime import UTC , datetime
66from pathlib import Path
7- from typing import Any , Dict
7+ from typing import Any
8+
9+ _EXTRA_LOG_FIELDS = (
10+ "request_id" ,
11+ "method" ,
12+ "path" ,
13+ "client_host" ,
14+ "query_params" ,
15+ "status_code" ,
16+ "duration_ms" ,
17+ )
818
919
1020class JsonFormatter (logging .Formatter ):
@@ -23,8 +33,8 @@ def format(self, record: logging.LogRecord) -> str:
2333 Returns:
2434 JSON-formatted string with log information.
2535 """
26- log_data : Dict [str , Any ] = {
27- "timestamp" : datetime .now (timezone . utc ).isoformat (),
36+ log_data : dict [str , Any ] = {
37+ "timestamp" : datetime .now (UTC ).isoformat (),
2838 "level" : record .levelname ,
2939 "logger" : record .name ,
3040 "module" : record .module ,
@@ -34,22 +44,10 @@ def format(self, record: logging.LogRecord) -> str:
3444 }
3545 if record .exc_info :
3646 log_data ["exception" ] = self .formatException (record .exc_info )
37- # core/logging.py
38- if hasattr (record , "request_id" ):
39- log_data ["request_id" ] = getattr (record , "request_id" )
40- if hasattr (record , "method" ):
41- log_data ["method" ] = getattr (record , "method" )
42- if hasattr (record , "path" ):
43- log_data ["path" ] = getattr (record , "path" )
44- if hasattr (record , "client_host" ):
45- log_data ["client_host" ] = getattr (record , "client_host" )
46- if hasattr (record , "query_params" ):
47- log_data ["query_params" ] = getattr (record , "query_params" )
48- if hasattr (record , "status_code" ):
49- log_data ["status_code" ] = getattr (record , "status_code" )
50- if hasattr (record , "duration_ms" ):
51- log_data ["duration_ms" ] = getattr (record , "duration_ms" )
52- # all routers
47+ for field in _EXTRA_LOG_FIELDS :
48+ value = getattr (record , field , None )
49+ if value is not None :
50+ log_data [field ] = value
5351 return json .dumps (log_data , default = str )
5452
5553
0 commit comments