我正在使用Python的日志记录库,并且实现了一个过滤器类,该类跟踪通过处理程序发出的记录,该处理程序将记录存储在文件中。如果之前已发出记录,则过滤器将返回False,这样就不会再次向我们发出同一事件的警报。
当我添加了第二个使用HTTPHandler发送记录的处理程序时,出现了问题。处理程序应具有相同的过滤器逻辑,因此我重用了过滤器。当第一个处理程序保存记录时,过滤器会分别跟踪该记录,因此当第二个处理程序出现时,它将找到记录并返回False。
过滤器是否有办法知道哪个处理程序正在发送记录,以便我可以区分它们,或者还有其他方法吗?我可以创建一个重复的过滤器类或将其子类化,但这感觉有点不对(不要重复自己以及所有这些内容)。
答案 0 :(得分:0)
我能够找到自己的问题的解决方案。我曾经创建过一次过滤器(我使用的是dictConfig)。原来是这样
{
"formatters": {"myformatter": "..."}
"handlers": {
"handlerA": {
"class": "myapp.logging.HandlerA",
"level": "INFO",
"formatter": "myformatter",
"filters": [
"myfilter"
]
}
"handlerB": {
"class": "myapp.logging.HandlerB",
"level": "INFO",
"formatter": "myformatter",
"filters": [
"myfilter"
]
}
},
"filters": {
"myfilter": {
"()": "myapp.logging.MyFilter"
}
}
"loggers": {
"myapp": {
"handlers": [
"handlerA",
"handlerB"
],
"level": "INFO"
}
}
}
这导致myfilter
实例被创建一次并共享。我没有重新实现该类两次,也不需要跟踪哪个处理程序正在发送记录,而是创建了一个链接到同一对象的新过滤器ID,这当然创建了该过滤器对象的新实例,在我的示例中,我将其称为{{ 1}}:
myotherfilter