【问题标题】:python logs to both stdout and stderrpython记录到stdout和stderr
【发布时间】:2021-03-08 20:44:18
【问题描述】:

我正在使用这样的 python 日志记录:

logging.basicConfig(stream=sys.stdout, level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
log = logging.getLogger()

一切正常。唯一的问题是所有日志消息都打印到标准输出和标准错误。 stdout 的格式符合我的预期。 stderr 只是在错误流中打印消息本身。

我看到log.handlers 确实包含 2 个处理程序。删除 stderr 似乎没有效果。尝试过这样的事情:

for handler in log.handlers:
    if handler.stream and handler.stream.name == '<stderr>':
        log.handlers.remove(handler)

有办法解决这个问题吗?

【问题讨论】:

    标签: python python-logging


    【解决方案1】:

    你可以使用logging.StreamHandler()

    这样:

    logging.basicConfig(handlers=[logging.StreamHandler()], level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    log = logging.getLogger()
    

    如果您还想达到某个级别,则可以使用 stderr(仅错误或错误和警告)和其他标准输出。您可以执行@crosswired 在此处建议的操作:

    logger = logging.getLogger("__name__")
    logger.setLevel(logging.DEBUG)
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    formatter = logging.Formatter(format)
    
    h1 = logging.StreamHandler(sys.stdout)
    h1.setLevel(logging.DEBUG)
    h1.addFilter(lambda record: record.levelno <= logging.INFO)
    h1.setFormatter(formatter)
    
    h2 = logging.StreamHandler()
    h2.setLevel(logging.WARNING)
    h2.setFormatter(formatter)
    logger.addHandler(h1)
    logger.addHandler(h2)
    logger.info("info")
    logger.error("error")
    

    Python logging split between stdout and stderr

    【讨论】:

    • 谢谢@green,但现在我在错误流中收到两条消息。一种格式化,一种未格式化。
    • 我稍微编辑了我的答案,我想它现在可以使用格式
    猜你喜欢
    • 2014-07-14
    • 2013-06-09
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2022-10-15
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多