Coverage for stlog/filter.py: 100%

21 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2024-08-21 07:31 +0000

1from __future__ import annotations 

2 

3import logging 

4 

5from stlog.base import RESERVED_ATTRS, STLOG_EXTRA_KEY 

6from stlog.context import LogContext 

7 

8 

9class ContextReinjectFilter(logging.Filter): 

10 """Logging Filter to reinject the global context in the log record. 

11 

12 For example when the log record was emitted by a non stlog logger. 

13 

14 The log record is modified in place and never filtered (filter() always 

15 return True). 

16 """ 

17 

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 ) 

23 

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