【问题标题】:Python logging module having a formatter causes AttributeError具有格式化程序的 Python 日志记录模块导致 AttributeError
【发布时间】:2016-03-23 00:46:05
【问题描述】:

我正在编写一个终端应用程序,在传入-v 选项后,毫无疑问,它会变得冗长。我想在终端中提供输出,以便于测试(无论如何,当以 cron 运行时,它会被重定向到日志文件)。

但是,python logging 模块不允许我在使用格式化程序时写出具有相应级别的消息。 (格式化程序直接复制自Python Logging Cookbok

此行为不仅限于 Python3。 Python2.7 在给定条件下也会引发同样的异常。


one.py

from sys import stdout
import logging

if __name__ == '__main__':

    level = 20

    log = logging.getLogger()
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler = logging.StreamHandler(stdout).setFormatter(formatter)
    log.addHandler(handler)
    log.setLevel(level)

    log.info("Blah")

one.py 输出

Traceback (most recent call last):
  File "/home/tlevi/PycharmProjects/untitled/main.py", line 14, in <module>
    log.info("Blah")
  File "/usr/lib/python3.4/logging/__init__.py", line 1279, in info
    self._log(INFO, msg, args, **kwargs)
  File "/usr/lib/python3.4/logging/__init__.py", line 1414, in _log
    self.handle(record)
  File "/usr/lib/python3.4/logging/__init__.py", line 1424, in handle
    self.callHandlers(record)
  File "/usr/lib/python3.4/logging/__init__.py", line 1485, in callHandlers
    if record.levelno >= hdlr.level:
AttributeError: 'NoneType' object has no attribute 'level'

two.py(像魅力一样工作)

from sys import stdout
import logging

if __name__ == '__main__':

    level = 20

    log = logging.getLogger()
    handler = logging.StreamHandler(stdout)
    log.addHandler(handler)
    log.setLevel(level)

    log.info("Blah")

两个.py 输出

Blah

【问题讨论】:

    标签: python logging stdout standard-library attributeerror


    【解决方案1】:

    代替

    handler = logging.StreamHandler(stdout).setFormatter(formatter)
    

    试试:

    handler = logging.StreamHandler(stdout)
    handler.setFormatter(formatter)
    

    发生的情况是,在第一种情况下,您将setFormatter() 的返回值分配给handler 变量,但setFormatter() 不返回处理程序(即它返回None

    【讨论】:

    • 在如此受欢迎的库中缺乏对链接的支持令人失望。
    • @Rikaelus - 它引出了一个问题“为什么它很受欢迎?”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多