【问题标题】:Python default and multi level loggingPython 默认和多级日志记录
【发布时间】:2022-10-23 21:27:07
【问题描述】:

根据我的阅读和理解,Python 日志记录模块默认记录到标准错误。

如果我运行这个 python 代码:

import logging


logging.info('test')
logging.warning('test')
logging.error('test')
logging.debug('test')

作为

python main.py 1> stdout.txt 2> stderr.txt

我在 stderr.txt 中获取日志,而在 stdout.txt 中没有任何内容 - 我的日志被重定向到 stderr。

当日志流式传输到日志聚合服务(例如 datadog 或 papertrail)时,此默认行为会出现问题。由于它流式传输到 stderr,因此日志被标记为错误,而实际上它们不是。

所以我尝试创建多个日志处理程序,如下所示:

import logging
import sys


stdoutHandler = logging.StreamHandler(stream=sys.stdout)
stderrHandler = logging.StreamHandler(stream=sys.stderr)

logging.basicConfig(level=logging.DEBUG, handlers=[stdoutHandler, stderrHandler])

stdoutHandler.setLevel(logging.DEBUG)
stderrHandler.setLevel(logging.ERROR)


logging.info('test')
logging.warning('test')
logging.error('test')
logging.debug('test')

当我运行此代码时,我在 sterr.txt 和 stdout.txt 中的所有日志中都出现错误 - 我最终在 stderr 和 stdout 流中都出现了日志重复错误日志。

有没有更好的方法来处理 Python 中错误日志与其他日志的区别?

我也尝试了loguru 包,在流分离方面也没有运气...... 提前致谢

【问题讨论】:

    标签: python logging stdout stderr observability


    【解决方案1】:

    您可能会从官方文档中描述的here 方法中受益。

    【讨论】:

    • 啊!我没看过那部分!会试一试的:)
    【解决方案2】:

    按照官方文档中描述的方法: https://docs.python.org/3.10/howto/logging-cookbook.html#custom-handling-of-levels

    这是我的流隔离代码:

    import sys
    import logging
    
    
    
    ROOT_LEVEL = logging.DEBUG
    
    
    class StdoutFilter(logging.Filter):
        def filter(self, record):
            return record.levelno >= ROOT_LEVEL and record.levelno < logging.ERROR
    
    
    class StderrFilter(logging.Filter):
        def filter(self, record):
            return record.levelno >= logging.ERROR
    
    
    
    stdoutHandler = logging.StreamHandler(stream=sys.stdout)
    stdoutHandler.addFilter(StdoutFilter())
    
    stderrHandler = logging.StreamHandler(stream=sys.stderr)
    stderrHandler.addFilter(StderrFilter())
    
    
    root_logger = logging.getLogger()
    root_logger.setLevel(ROOT_LEVEL)
    
    root_logger.addHandler(stderrHandler)
    root_logger.addHandler(stdoutHandler)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 2019-01-07
      相关资源
      最近更新 更多