【问题标题】:Why does log.debug() not log when the level is set to logging.DEBUG?为什么在级别设置为 logging.DEBUG 时 log.debug() 不记录?
【发布时间】:2020-09-19 20:38:33
【问题描述】:

我原以为下面的代码会输出两个日志行

import logging

log = logging.getLogger('hello')
log.setLevel(logging.DEBUG)
print(log.getEffectiveLevel())
log.debug('debug log')
log.critical('critical log')

输出是

10
critical log

级别正确设置为10(其中corresponds to DEBUG),尽管log.debug('debug log') 没有输出任何内容 - 为什么?

【问题讨论】:

  • 您的意思是将日志打印到stdoutstderr
  • @MiguelTrejo:为什么会有不同?调试消息会打印在关键消息之外的其他地方吗?而这在其他地方不会受到.setLevel()的影响?
  • 您只设置记录器本身的级别,而不是用于将日志消息打印到标准错误的初始处理程序。处理程序和记录器具有不同的级别,因此(例如)单个记录器可以将调试消息写入控制台,但只能将严重错误写入 SMTP 处理程序以通知某人需要解决的问题。

标签: python python-3.x logging


【解决方案1】:

您还没有配置日志系统,所以它仍然使用默认值(根记录器的级别 WARN)。

https://docs.python.org/3/library/logging.html#logging.basicConfigbasicConfig

通过创建一个日志系统对日志系统进行基本配置 StreamHandler 具有默认的 Formatter 并将其添加到根 记录器。

首先使用basicConfig 配置日志系统将创建您的记录器将使用的处理程序和格式化程序:

logging.basicConfig()
log = logging.getLogger('hello')
log.setLevel(logging.DEBUG)
print(log.getEffectiveLevel())
log.debug('debug log')
log.critical('critical log')

输出:

10
DEBUG:hello:debug log
CRITICAL:hello:critical log

Logger.callHandlers 中,每个处理程序都会将日志记录的级别与其级别进行比较。如果没有任何处理程序,它将使用警告的default

【讨论】:

  • 谢谢 - 所以在我的情况下,我的 log 输出仍然由默认的 WARNING 级别驱动,尽管被有效地设置为 DEBUG?
  • 是的,您将记录器设置为调试,但它没有连接到处理程序(还没有处理程序)。尝试使用print('handlers=', logging.getLogger().handlers) 和不使用basicConfig。 Handler (docs.python.org/3/library/logging.html#logging.Handler) 上的文档显示__init__(level=NOTSET) 方法采用级别参数。
  • 但是如果没有处理程序,如何显示关键级别的消息?因为它是由根级别记录器处理的? (尽管有自己的记录器以某种方式冒泡到根记录器?)
  • 如果没有,则使用默认的WARNING级别:github.com/python/cpython/blob/master/Lib/logging/…
  • @WoJ 显示某些内容的原因是,当没有配置处理程序时,会使用内部“最后的处理程序”,其级别为WARNING。记录在这里:docs.python.org/3/library/…
【解决方案2】:

StreamHandler

将日志输出发送到流,例如 sys.stdout、sys.stderr 或任何类似文件的对象"

根据documentation

import logging 
import sys

# Initialize Logger and set Level to DEBUG
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

# Initialize a Handler to print to stdout
handler = logging.StreamHandler(sys.stdout)

# Format Handler output
logFormatter = logging.Formatter(
    "%(asctime)s %(message)s", datefmt="%m/%d/%Y %I:%M:%S %p"
)
handler.setFormatter(logFormatter)

# Set Handler Level to DEBUG
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)

logger.debug('Debug Info')
>>> 09/19/2020 09:01:00 PM Debug Info

【讨论】:

    【解决方案3】:

    您需要添加流处理程序

    import logging
    
    log = logging.getLogger('hello')
    log.setLevel(logging.DEBUG)
    
    # # Create a file handler to store the logs
    file_handler = logging.FileHandler('test.log')
    log.addHandler(file_handler)
    
    # # Send output to terminal
    stream_handler = logging.StreamHandler()
    log.addHandler(stream_handler)
    
    log.debug('debug log')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2013-12-09
      • 2016-09-19
      • 2021-01-22
      • 2010-10-10
      • 1970-01-01
      相关资源
      最近更新 更多