mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
gh-92592: Allow logging filters to return a LogRecord. (GH-92591)
This commit is contained in:
parent
70690c7233
commit
296081a7ce
5 changed files with 117 additions and 13 deletions
|
@ -468,6 +468,51 @@ class CustomLevelsAndFiltersTest(BaseTest):
|
|||
for lvl in LEVEL_RANGE:
|
||||
logger.log(lvl, self.next_message())
|
||||
|
||||
def test_handler_filter_replaces_record(self):
|
||||
def replace_message(record: logging.LogRecord):
|
||||
record = copy.copy(record)
|
||||
record.msg = "new message!"
|
||||
return record
|
||||
|
||||
# Set up a logging hierarchy such that "child" and it's handler
|
||||
# (and thus `replace_message()`) always get called before
|
||||
# propagating up to "parent".
|
||||
# Then we can confirm that `replace_message()` was able to
|
||||
# replace the log record without having a side effect on
|
||||
# other loggers or handlers.
|
||||
parent = logging.getLogger("parent")
|
||||
child = logging.getLogger("parent.child")
|
||||
stream_1 = io.StringIO()
|
||||
stream_2 = io.StringIO()
|
||||
handler_1 = logging.StreamHandler(stream_1)
|
||||
handler_2 = logging.StreamHandler(stream_2)
|
||||
handler_2.addFilter(replace_message)
|
||||
parent.addHandler(handler_1)
|
||||
child.addHandler(handler_2)
|
||||
|
||||
child.info("original message")
|
||||
handler_1.flush()
|
||||
handler_2.flush()
|
||||
self.assertEqual(stream_1.getvalue(), "original message\n")
|
||||
self.assertEqual(stream_2.getvalue(), "new message!\n")
|
||||
|
||||
def test_logging_filter_replaces_record(self):
|
||||
records = set()
|
||||
|
||||
class RecordingFilter(logging.Filter):
|
||||
def filter(self, record: logging.LogRecord):
|
||||
records.add(id(record))
|
||||
return copy.copy(record)
|
||||
|
||||
logger = logging.getLogger("logger")
|
||||
logger.setLevel(logging.INFO)
|
||||
logger.addFilter(RecordingFilter())
|
||||
logger.addFilter(RecordingFilter())
|
||||
|
||||
logger.info("msg")
|
||||
|
||||
self.assertEqual(2, len(records))
|
||||
|
||||
def test_logger_filter(self):
|
||||
# Filter at logger level.
|
||||
self.root_logger.setLevel(VERBOSE)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue