在Python中使用共享过滤器而不共享状态

问题描述

我正在使用Python的日志记录库,并且实现了一个过滤器类,该类跟踪通过处理程序发出的记录,该处理程序将记录存储在文件中。如果之前已发出记录,则过滤器将返回False,这样就不会再次向我们发出同一事件的警报。

当我添加了第二个使用HTTPHandler发送记录的处理程序时,出现了问题。处理程序应具有相同的过滤器逻辑,因此我重用了过滤器。当第一个处理程序保存记录时,过滤器会分别跟踪该记录,因此当第二个处理程序出现时,它将找到记录并返回False。

过滤器是否有办法知道哪个处理程序正在发送记录,以便我可以区分它们,或者还有其他方法吗?我可以创建一个重复的过滤器类或将其子类化,但这感觉有点不对(不要重复自己以及所有这些内容)。

解决方法

我能够找到自己的问题的解决方案。我曾经创建过一次过滤器(我使用的是dictConfig)。原来是这样

{
    "formatters": {"myformatter": "..."}
    "handlers": {
        "handlerA": {
            "class": "myapp.logging.HandlerA","level": "INFO","formatter": "myformatter","filters": [
                "myfilter"
            ]
        }
        "handlerB": {
            "class": "myapp.logging.HandlerB","filters": [
                "myfilter"
            ]
        }
    },"filters": {
        "myfilter": {
            "()": "myapp.logging.MyFilter"
        }
    }
    "loggers": {
        "myapp": {
            "handlers": [
                "handlerA","handlerB"
            ],"level": "INFO"
        }
    }
}

这导致myfilter实例被创建一次并共享。我没有重新实现该类两次,也不需要跟踪哪个处理程序正在发送记录,而是创建了一个链接到同一对象的新过滤器ID,这当然创建了该过滤器对象的新实例,在我的示例中,我将其称为{{ 1}}:

myotherfilter

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...