【问题标题】:logging module : StreamHandler does not seem to attach to logger日志记录模块:StreamHandler 似乎没有附加到记录器
【发布时间】:2019-12-17 03:50:28
【问题描述】:

我正在学习 Python 的日志记录模块,但我不知道为什么我不能记录 DEBUG 和 INFO 消息。这是代码(python 2.7):

import logging

if __name__ == "__main__" :

    logger = logging.getLogger("test")
    c_handler = logging.StreamHandler()
    c_handler.setLevel(logging.DEBUG)

    logger.addHandler(c_handler)


    # test 
    logger.debug('This is a debug message')
    logger.info('This is an info message')
    logger.warning('This is a warning message')
    logger.error('This is an error message')
    logger.critical('This is a critical message')

这会导致这个输出

This is a warning message
This is an error message
This is a critical message

我希望这个输出

This is a debug message
This is an info message
This is a warning message
This is an error message
This is a critical message

看起来 c_handler.setLevel(logging.DEBUG) 不起作用,记录器使用其默认设置。默认情况下,它不会记录 DEBUG 和 INFO 日志。

我做错了什么?

【问题讨论】:

  • Handler 只处理日志。所以它 logger 的日志级别更高,它忽略了较低的级别,所以处理程序永远不会收到它们。
  • 所以,基本上,您还需要执行logger.setLevel(logging.DEBUG),以获取所有日志消息并将它们传递给处理程序。然后,根据您的处理程序及其配置,您可以获得所有信息,例如在标准输出上,只有一个文件中的错误,等等。

标签: python logging


【解决方案1】:

This diagram from the docs(见下文)有助于解释日志记录的工作原理。注意顶部附近的两颗钻石。 “记录器流”菱形检查“为调用级别启用记录器”,而“处理程序流”菱形检查“为 LogRecord 级别启用处理程序”。这暗示了这样一个事实 记录器和处理程序都有记录级别。

要记录 DEBUG 级别记录,请将 logger 的级别设置为 DEBUG(以及将处理程序级别设置为 DEBUG):

logger = logging.getLogger("test")
logger.setLevel(logging.DEBUG)    


import logging

if __name__ == "__main__" :

    logger = logging.getLogger("test")
    logger.setLevel(logging.DEBUG)    
    c_handler = logging.StreamHandler()
    c_handler.setLevel(logging.DEBUG)
    logger.addHandler(c_handler)

    # test 
    logger.debug('This is a debug message')
    logger.info('This is an info message')
    logger.warning('This is a warning message')
    logger.error('This is an error message')
    logger.critical('This is a critical message')

打印

This is a debug message
This is an info message
This is a warning message
This is an error message
This is a critical message

【讨论】:

    【解决方案2】:

    根据文档

    默认级别为WARNING,表示只有本次事件 级别及以上将被跟踪,除非日志记录包是 配置为不这样做。

    你可以在导入日志包后添加这样的东西,它应该可以工作

    logging.basicConfig(level=logging.DEBUG)
    

    【讨论】:

      【解决方案3】:

      谢谢大家

      使用

       logger.setLevel(logging.DEBUG)
      

      改变技巧。

      顺便说一句,我也试过了

       logging.basicConfig(level=logging.DEBUG)
      

      但是给出这个输出:

       This is a debug message
      DEBUG:test:This is a debug message
      This is an info message
      INFO:test:This is an info message
      This is a warning message
      WARNING:test:This is a warning message
      This is an error message
      ERROR:test:This is an error message
      This is a critical message
      CRITICAL:test:This is a critical message
      
      

      【讨论】:

      • logging.basicConfig 是一个方便的函数,用于在根记录器上设置处理程序。它通常用作手动创建的记录器和处理程序的替代方案。
      猜你喜欢
      • 1970-01-01
      • 2010-11-25
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      相关资源
      最近更新 更多