[英]install filter on logging level in python using dictConfig
我無法使用dictConfig()
語法在日志處理程序上安裝過濾器。 LoggingErrorFilter.filter()
被簡單地忽略,沒有任何反應。
我想過濾掉錯誤消息,以便它們不會在日志輸出中出現兩次。 所以我寫了LoggingErrorFilter
類並覆蓋了filter()
。
我的配置:
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)
我在這里做錯了什么? 為什么我的過濾器被忽略?
實際上, Tupteq
的答案通常是不正確的。 以下腳本:
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')
運行時,產生以下輸出:
$ python filtcfg.py
2.7.5+ (default, Sep 19 2013, 13:48:49)
[GCC 4.8.1]
changed: hello
這表明您可以使用dictConfig()
配置過濾器。
如果想從 json 文件加載。 應該是這樣
{
"version": 1,
"grey": "/x1b[38;21m",
"yellow": "/x1b[33;21m",
"red": "/x1b[31;21m",
"bold_red": "/x1b[31;1m",
"reset": "/x1b[0m",
"filters": {
"audit_filter": {
"()": "app.logs.AuditFilter.AuditFilter",
"param": "audit"
},
"ignore_audit_filter": {
"()": "app.logs.AuditFilter.IgnoreAuditFilter",
"param": "audit"
}
},
"formatters": {
"package_formatter": {
"format": "[%(asctime)s] - [%(levelname)s] - [%(name)s] : %(message)s"
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "package_formatter"
},
"development_file_handler": {
"class": "logging.FileHandler",
"filename": "../debug.log",
"level": "DEBUG",
"formatter": "package_formatter",
"filters": [
"ignore_audit_filter"
]
},
"audit_file_handler": {
"class": "logging.FileHandler",
"filename": "../audit.log",
"level": "DEBUG",
"formatter": "package_formatter",
"filters": [
"audit_filter"
]
}
},
"loggers": {
"audit": {
"handlers": [
"audit_file_handler"
],
"level": "INFO"
}
},
"root": {
"level": "INFO",
"handlers": [
"console",
"development_file_handler"
]
}
}
初始化然后附加記錄器並運行記錄器使用app.logger = logging.getlogger("audit")
運行應用程序
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.