@@ -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
0 commit comments