这是一个简单的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
处理程序并以我的日志文件结束?
答案 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!")