首页 > 解决方案 > 使用相同的记录器通过 python 日志记录分离文件输出

问题描述

使用以下代码,我将信息日志写入 info.log 并将错误日志写入 error.log

import logging
logger_info = logging.getLogger('info')
logger_err = logging.getLogger('err')
logger_info.setLevel(logging.INFO)
logger_err.setLevel(logging.WARNING)
info_file_handler = logging.FileHandler('info.log')
error_file_handler = logging.FileHandler('error.log')
logger_info.addHandler(info_file_handler)
logger_err.addHandler(error_file_handler)
logger_info.info('info test')
logger_err.error('error test')

现在我使用 2 个记录器:logger_err 和 logger_info。

我可以将这 2 个记录器转换为 1 个记录器,它们logger_info.info将写入info.loglogger_info.error写入error.log

标签: pythonlogging

解决方案


这并不常见,因为日志记录通常会处理严重性高于阈值的消息,但可以通过使用 2 个处理程序和自定义过滤器来实现:

  • 您将处理程序附加到具有 ERROR 级别的记录器并使其写入 error.log 文件
  • 您将第二个处理程序附加到具有 INFO 级别的同一记录器并使其写入 info.log 文件
  • 您将自定义过滤器添加到第二个处理程序以拒绝级别高于 INFO 的消息

演示:

class RevFilter:
"""A filter to reject messages ABOVE a maximum level"""
    def __init__(self, maxLev):
        self.maxLev = maxLev
    def filter(self, record):
        return record.levelno <= self.maxLev

hinf = logging.FileHandler('/path/to/info.log')
herr = logging.FileHandler('/path/to/error.log')
herr.setLevel(logging.ERROR)
hinf.setLevel(logging.INFO)
hinf.addFilter(RevFilter(logging.INFO))

logger = logging.getLogger(name)
logger.addHandler(hinf)
logger.addHandler(herr)

logger.setLevel(logging.INFO) # or lower of course...

从那时起,文件error.log将接收loggerERROR或更高级别发送的消息,而info.log将仅接收INFO级别的消息,不高也不低。


推荐阅读