Set a logging level filter in python using dictConfig

I cannot set a filter for the logging handler using the dictConfig() syntax. LoggingErrorFilter.filter() simply ignored, nothing happens.

I want to filter out error messages so that they do not appear twice in the log. So I wrote the LoggingErrorFilter class and overrode filter() .

My configuration:

 class LoggingErrorFilter(logging.Filter): def filter(self, record): print 'filter!' return record.levelno == logging.ERROR or record.levelno == logging.CRITICAL config = { 'version': 1, 'disable_existing_loggers' : False, 'formatters' : { 'standard' : { 'format' : '%(asctime)s %(levelname)s %(name)s::%(message)s', }, }, 'handlers' : { 'console': { 'class' : 'logging.StreamHandler', 'level' : level, 'formatter' : 'standard', 'stream' : 'ext://sys.stdout', }, 'errorconsole': { 'class' : 'logging.StreamHandler', 'level' : 'ERROR', 'formatter' : 'standard', 'stream' : 'ext://sys.stderr', 'filters' :['errorfilter',], }, }, 'filters': { 'errorfilter': { 'class' : 'LoggingErrorFilter', } }, 'loggers' : { '' : { 'handlers' : ['errorconsole','console',], 'level' : level, 'propagate' : True, }, name : { 'handlers' : ['errorconsole','console',], 'level' : level, 'propagate' : False, }, }, } logging.config.dictConfig(config) 

What am I doing wrong here? Why is my filter ignored?

+8
python logging
source share
2 answers

Actually, the Tupteq answer Tupteq not correct at all. Next script:

 import logging import logging.config import sys class MyFilter(logging.Filter): def __init__(self, param=None): self.param = param def filter(self, record): if self.param is None: allow = True else: allow = self.param not in record.msg if allow: record.msg = 'changed: ' + record.msg return allow LOGGING = { 'version': 1, 'filters': { 'myfilter': { '()': MyFilter, 'param': 'noshow', } }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'filters': ['myfilter'] } }, 'root': { 'level': 'DEBUG', 'handlers': ['console'] }, } if __name__ == '__main__': print(sys.version) logging.config.dictConfig(LOGGING) logging.debug('hello') logging.debug('hello - noshow') 

At startup, it displays the following output:

 $ python filtcfg.py 2.7.5+ (default, Sep 19 2013, 13:48:49) [GCC 4.8.1] changed: hello 

which shows that you can configure filters using dictConfig() .

+17
source share

You can specify a class name, but this is done using a strange name () , and it must contain the name of the module. For example:.

  'filters': { 'errorfilter': { '()' : '__main__.LoggingErrorFilter', } }, 
+5
source share

All Articles