Coverage for stlog/filter.py: 100%
21 statements
« prev ^ index » next coverage.py v7.2.7, created at 2024-08-21 07:31 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2024-08-21 07:31 +0000
1from __future__ import annotations
3import logging
5from stlog.base import RESERVED_ATTRS, STLOG_EXTRA_KEY
6from stlog.context import LogContext
9class ContextReinjectFilter(logging.Filter):
10 """Logging Filter to reinject the global context in the log record.
12 For example when the log record was emitted by a non stlog logger.
14 The log record is modified in place and never filtered (filter() always
15 return True).
16 """
18 def __init__(self, name="", read_extra_kwargs_from_standard_logging: bool = False):
19 super().__init__(name)
20 self.read_extra_kwargs_from_standard_logging = (
21 read_extra_kwargs_from_standard_logging
22 )
24 def filter(self, record: logging.LogRecord) -> bool:
25 if not hasattr(record, STLOG_EXTRA_KEY):
26 # the context is not already injected in record
27 # (this log didn't pass by stlog ContextVarsAdapter)
28 # => let's fix that
29 new_kwargs = LogContext._get()
30 extra_keys: set[str] = getattr(record, STLOG_EXTRA_KEY, set())
31 for k, v in new_kwargs.items():
32 setattr(record, k, v)
33 extra_keys.add(k)
34 if self.read_extra_kwargs_from_standard_logging:
35 # try to find special keys set by extra kwargs in
36 # standard python logging
37 for k in vars(record).keys():
38 if k not in RESERVED_ATTRS:
39 extra_keys.add(k)
40 setattr(record, STLOG_EXTRA_KEY, extra_keys)
41 return True