【问题标题】:Use shared filter in Python without sharing state在 Python 中使用共享过滤器而不共享状态
【发布时间】:2020-08-20 18:23:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: python logging python-logging


    【解决方案1】:

    我能够找到解决我自己问题的方法。我曾经创建过过滤器(我正在使用 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,这当然创建了过滤器对象的一个​​新实例,我在我的示例中称为 @987654323 @:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      相关资源
      最近更新 更多