Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6dbed2e

Browse files
committed
logging: Allowed filters to be just callables.
1 parent 6fac817 commit 6dbed2e

3 files changed

Lines changed: 45 additions & 1 deletion

File tree

Lib/logging/__init__.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -604,10 +604,23 @@ def filter(self, record):
604604
The default is to allow the record to be logged; any filter can veto
605605
this and the record is then dropped. Returns a zero value if a record
606606
is to be dropped, else non-zero.
607+
608+
.. versionchanged: 3.2
609+
610+
Allow filters to be just callables.
607611
"""
608612
rv = 1
609613
for f in self.filters:
610-
if not f.filter(record):
614+
if hasattr(f, 'filter'):
615+
result = f.filter(record)
616+
elif hasattr(f, '__call__'):
617+
try:
618+
result = f(record)
619+
except Exception:
620+
result = True # filter failed, assume a pass
621+
else:
622+
result = False # we don't know what f is
623+
if not result:
611624
rv = 0
612625
break
613626
return rv

Lib/test/test_logging.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,35 @@ def test_filter(self):
309309
finally:
310310
handler.removeFilter(filter_)
311311

312+
def test_callable_filter(self):
313+
# Only messages satisfying the specified criteria pass through the
314+
# filter.
315+
316+
def filterfunc(record):
317+
parts = record.name.split('.')
318+
prefix = '.'.join(parts[:2])
319+
return prefix == 'spam.eggs'
320+
321+
handler = self.root_logger.handlers[0]
322+
try:
323+
handler.addFilter(filterfunc)
324+
spam = logging.getLogger("spam")
325+
spam_eggs = logging.getLogger("spam.eggs")
326+
spam_eggs_fish = logging.getLogger("spam.eggs.fish")
327+
spam_bakedbeans = logging.getLogger("spam.bakedbeans")
328+
329+
spam.info(self.next_message())
330+
spam_eggs.info(self.next_message()) # Good.
331+
spam_eggs_fish.info(self.next_message()) # Good.
332+
spam_bakedbeans.info(self.next_message())
333+
334+
self.assert_log_lines([
335+
('spam.eggs', 'INFO', '2'),
336+
('spam.eggs.fish', 'INFO', '3'),
337+
])
338+
finally:
339+
handler.removeFilter(filterfunc)
340+
312341

313342
#
314343
# First, we define our levels. There can be as many as you want - the only

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ Core and Builtins
3434
Library
3535
-------
3636

37+
- logging: Allowed filters to be just callables.
38+
3739
- logging: Added tests for _logRecordClass changes.
3840

3941
- Issue #10092: Properly reset locale in calendar.Locale*Calendar classes.

0 commit comments

Comments
 (0)