mirror of
https://github.com/python/cpython.git
synced 2025-11-03 03:22:27 +00:00
logging: Allowed filters to be just callables.
This commit is contained in:
parent
6fac817136
commit
6dbed2e8b3
3 changed files with 45 additions and 1 deletions
|
|
@ -604,10 +604,23 @@ class Filterer(object):
|
|||
The default is to allow the record to be logged; any filter can veto
|
||||
this and the record is then dropped. Returns a zero value if a record
|
||||
is to be dropped, else non-zero.
|
||||
|
||||
.. versionchanged: 3.2
|
||||
|
||||
Allow filters to be just callables.
|
||||
"""
|
||||
rv = 1
|
||||
for f in self.filters:
|
||||
if not f.filter(record):
|
||||
if hasattr(f, 'filter'):
|
||||
result = f.filter(record)
|
||||
elif hasattr(f, '__call__'):
|
||||
try:
|
||||
result = f(record)
|
||||
except Exception:
|
||||
result = True # filter failed, assume a pass
|
||||
else:
|
||||
result = False # we don't know what f is
|
||||
if not result:
|
||||
rv = 0
|
||||
break
|
||||
return rv
|
||||
|
|
|
|||
|
|
@ -309,6 +309,35 @@ class BasicFilterTest(BaseTest):
|
|||
finally:
|
||||
handler.removeFilter(filter_)
|
||||
|
||||
def test_callable_filter(self):
|
||||
# Only messages satisfying the specified criteria pass through the
|
||||
# filter.
|
||||
|
||||
def filterfunc(record):
|
||||
parts = record.name.split('.')
|
||||
prefix = '.'.join(parts[:2])
|
||||
return prefix == 'spam.eggs'
|
||||
|
||||
handler = self.root_logger.handlers[0]
|
||||
try:
|
||||
handler.addFilter(filterfunc)
|
||||
spam = logging.getLogger("spam")
|
||||
spam_eggs = logging.getLogger("spam.eggs")
|
||||
spam_eggs_fish = logging.getLogger("spam.eggs.fish")
|
||||
spam_bakedbeans = logging.getLogger("spam.bakedbeans")
|
||||
|
||||
spam.info(self.next_message())
|
||||
spam_eggs.info(self.next_message()) # Good.
|
||||
spam_eggs_fish.info(self.next_message()) # Good.
|
||||
spam_bakedbeans.info(self.next_message())
|
||||
|
||||
self.assert_log_lines([
|
||||
('spam.eggs', 'INFO', '2'),
|
||||
('spam.eggs.fish', 'INFO', '3'),
|
||||
])
|
||||
finally:
|
||||
handler.removeFilter(filterfunc)
|
||||
|
||||
|
||||
#
|
||||
# First, we define our levels. There can be as many as you want - the only
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- logging: Allowed filters to be just callables.
|
||||
|
||||
- logging: Added tests for _logRecordClass changes.
|
||||
|
||||
- Issue #10092: Properly reset locale in calendar.Locale*Calendar classes.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue