为什么我的日志记录过滤器应用于错误的处理程序?

时间:2016-08-08 23:14:26

标签: python logging filter

这是一个简单的Python过滤器,除了放置" TEST - "在日志消息前面。 (真正的过滤器稍后会做更多有用的处理):

class TimeStamp_Filter(logging.Filter):
    def filter(self, record):
        record.msg = "TEST - " + str(record.msg)
        return True

这里的配置是从JSON文件中提取的,并使用dictConfig()解析:

{
    "version": 1,
    "disable_existing_loggers": false,
    "filters": {
        "timestamp_filter": {
            "()": "TimeStamp_Filter"
        }
    },
    "handlers": {
        "file_handler": {
            "class": "logging.FileHandler",
            "level": "INFO",
            "filename": "../log/default.log",
            "mode": "a"                      
        },
        "console": {
            "class": "logging.StreamHandler",
            "level": "DEBUG",
            "filters": ["timestamp_filter"],
            "stream": "ext://sys.stdout"
        }
    },
    "root": {
        "level": "DEBUG",
        "handlers": ["console", "file_handler"]
    }
}

过滤器本身似乎有效 - 如果我创建一个记录器并运行logger.info("Hello, world!"),我会在屏幕上显示输出TEST - Hello, world!

但是我在我的default.log文件中获取该输出(包括" TEST")。我原以为通过仅将timestamp_filter附加到console处理程序,我只能在屏幕上获得TEST输出。

为什么还要发送到file_handler处理程序并以我的日志文件结束?

1 个答案:

答案 0 :(得分:0)

您正在从过滤器更改日志记录的消息。这导致了这个问题。

Python会将该过滤器应用于您的控制台输出,但是当它发生时,它会更改原始日志消息。因此,当日志消息传递给文件处理程序时,消息已经更改并包含该额外输入。

如果要更改特定处理程序的日志格式,则应考虑使用格式化程序。过滤用于选择记录哪个消息以及哪个消息不应该记录。

更新:根据评论,这里有一个示例代码,解释了我们如何使用自定义格式化程序并在其中处理业务逻辑。

import logging
import sys


class CustomFormatter(logging.Formatter):
    def format(self, record):
        mycondition = True  # Here goes your business logic
        formatted_message = super().format(record=record)

        if mycondition:
            formatted_message += "TEST"

        return formatted_message


logger = logging.getLogger("test")
logger.setLevel(logging.DEBUG)

handler = logging.StreamHandler(stream=sys.stdout)
handler.setFormatter(CustomFormatter())
logger.addHandler(handler)



logger.info("Hello!")