【问题标题】:Python logging module not logging info even after level is set即使设置了级别,Python 日志模块也不会记录信息
【发布时间】:2017-11-03 04:07:20
【问题描述】:

我正在尝试做一些基本的日志记录。我正在执行以下操作:

log = logging.getLogger('test')

log.error('test') # 'test' gets logged

log.info('test') # Nothing gets logged, as expected

log.setLevel(logging.INFO) # Now info should be logged, right?

log.info('test') # No output

log.setLevel(logging.INFO) # Getting desperate

log.info('test') # Still nothing

我缺少日志记录模块的哪些方面?

【问题讨论】:

  • 太糟糕了,没有一个答案进一步详细说明为什么会这样(除了“你需要添加处理程序”)。这确实值得解释,因为这种行为确实违反直觉。

标签: python python-3.x logging


【解决方案1】:

您忘记添加处理程序,即logging.basicConfig(),您能否检查以下代码是否适合您。

import logging
logging.basicConfig()
log = logging.getLogger('test')
log.setLevel(logging.INFO)
log.error('test')
log.info('test')

【讨论】:

    【解决方案2】:

    您需要在使用之前配置日志记录,如下所示。你可以在python中漂亮地配置它。

    logging.basicConfig(format='%(asctime)s %(name)25s %(lineno)4d %(levelname)8s: %(message)s', level=40)
    

    上面的语句将打印时间戳、文件名、行号、级别类型、消息

    日志级别也可以在基本配置本身期间设置(40 = 错误)

    【讨论】:

    • 次要注意,40 不是 DEBUG,10 是。 40 是错误的。
    【解决方案3】:

    无需拨打basicConfig

    但是,问题在于处理程序(正如@Mahesh Karia 所指出的那样)。

    你看,如果你不定义一些处理程序,你就会依赖于你已经“到位”的任何东西,这会引起很多混乱。

    检查一下:

    你创建你的“测试”记录器

    >>> log = logging.getLogger('test')
    

    打印警告消息,但即使在将级别设置为 INFO 后也不打印 INFO 消息:

    >>> log.warning('hi')
    hi
    >>> log.setLevel(logging.INFO)
    >>> log.info('hi')
    >>> 
    

    (我个人认为这是非常错误的行为)

    可以通过操纵“处理程序”来“解决”。

    你的“测试”记录器没有

    >>> log.handlers
    []
    

    它也不是“根记录器”的父级

    >>> log.parent
    <RootLogger root (WARNING)>
    >>> log.parent.handlers
    []
    

    然而,可以很容易地添加一个处理程序(到根记录器)

    >>> log.parent.addHandler(logging.StreamHandler())
    

    现在你的“测试”记录器“工作”了:

    >>> log.info('hi')
    hi
    

    附言。导入 logging 模块后使用 Python 3.8.2 提示符。

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      相关资源
      最近更新 更多