install filter on logging level in python using dictConfig
logging, python, python-2.7, python-logging
Solution
Actually, `Tupteq`'s answer is not correct in general. The following 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')
When run, produces 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()`.
Problem
I cannot install a filter on a logging handler using `dictConfig()` syntax. `LoggingErrorFilter.filter()` is simply ignored, nothing happens. I want to filter out error messages so that they do not appear twice in the log output. So I wrote `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?