簡體   English   中英

具有格式化程序的Python日志記錄模塊會導致AttributeError

[英]Python logging module having a formatter causes AttributeError

我正在編寫一個終端應用程序,在傳入-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")

two.py輸出

Blah

代替

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

嘗試:

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

發生的事情是,在第一種情況下,您將setFormatter()的返回值分配給handler變量,但是setFormatter()不返回處理程序(即它返回None

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM