3
3
import os
4
4
import sys
5
5
6
+ from app .core .request_context import RequestContext
6
7
from app .utils .getenv import getenv_bool
7
8
8
9
# TODO consider refactoring, see https://github.com/mCodingLLC/VideosSampleCode/tree/master/videos/135_modern_logging
9
10
10
11
_IS_LOGGING_INITIALIZED = False
11
12
# see https://docs.python.org/3/library/logging.html#logrecord-attributes
12
- _LOG_FORMAT = (
13
- "%(asctime)s | %(levelname)-5.5s | %(threadName)s | %(name)s :: %(message)s"
14
- )
13
+ _LOG_FORMAT = "%(asctime)s | %(levelname)-5.5s | %(threadName)s | %(name)s [%(request_id)s] :: %(message)s"
15
14
_FORMATTER = logging .Formatter ()
16
15
17
16
@@ -30,6 +29,7 @@ def _log_record_to_json(record: logging.LogRecord) -> dict:
30
29
_FORMATTER .formatException (record .exc_info ) if record .exc_info else None
31
30
),
32
31
"stack_info" : record .stack_info ,
32
+ "request_id" : record .request_id if hasattr (record , "request_id" ) else None ,
33
33
}.items ()
34
34
if v
35
35
}
@@ -51,6 +51,17 @@ def format(self, record: logging.LogRecord) -> str:
51
51
return _handler
52
52
53
53
54
+ class RequestIdFilter (logging .Filter ):
55
+
56
+ def __init__ (self , name : str = "" ):
57
+ super ().__init__ (name = name )
58
+
59
+ def filter (self , record : logging .LogRecord ) -> bool :
60
+ if not hasattr (record , "request_id" ):
61
+ record .request_id = RequestContext .get_request_id ()
62
+ return True
63
+
64
+
54
65
def _setup_logging ():
55
66
log_level = os .getenv (key = "LOG_LEVEL" , default = "info" ).upper ()
56
67
log_as_json = getenv_bool (key = "LOG_AS_JSON" , default = True )
@@ -61,6 +72,7 @@ def _setup_logging():
61
72
62
73
# re-configure root logger handler
63
74
_handler = _build_json_handler () if log_as_json else _build_handler ()
75
+ _handler .addFilter (RequestIdFilter ())
64
76
logging .root .addHandler (_handler )
65
77
66
78
# set root logger level
0 commit comments