【问题标题】:Using same logger to seperate file outout with python logging使用相同的记录器将文件输出与 python 日志记录分开
【发布时间】:2021-02-25 17:58:39
【问题描述】:

我使用以下代码将信息日志写入 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

【问题讨论】:

    标签: python logging


    【解决方案1】:

    这并不常见,因为日志记录通常会处理严重性高于阈值的消息,但可以通过使用 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将接收logger发送的ERROR或更高级别的消息,而info.log将只接收INFO级别的消息,不高也不低。

    【讨论】:

      【解决方案2】:

      我不确定我是否理解您想要实现的目标,但如果您只是想将两种类型的消息记录到同一个文件中,您可以在创建两个 FileHandler 时指定同一个输出文件:

      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('combined.log')
      error_file_handler = logging.FileHandler('combined.log')
      logger_info.addHandler(info_file_handler)
      logger_err.addHandler(error_file_handler)
      logger_info.info('info test')
      logger_err.error('error test')
      

      【讨论】:

      • 我的意思是logger_info.info 将写入info.loglogger_info.error 将写入error.log
      猜你喜欢
      • 1970-01-01
      • 2019-04-24
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      相关资源
      最近更新 更多