我知道这个问题已经被问过无数次了,但我就是不知道为什么:
import logging
from mylib import MyClass
hdlr = logging.FileHandler("MyLog.log", encoding="utf-16", mode="w")
hdlr.setFormatter(
logging.Formatter("[%(levelname)s] %(name)s <%(module)s.%(funcName)s> %(message)s")
)
hdlr.setLevel(logging.DEBUG)
myobj = MyClass(handlers=[hdlr])
其中定义MyClass
的myclass.py
看起来像这样:
import logging
logger = logging.getLogger("MyClass")
class MyClass:
def __init__(self, handlers):
for hdlr in handlers:
logging.root.addHandler(hdlr)
只输出文件中的WARNING
消息。
我阅读了这个问题,并且我验证了在将处理程序添加到根记录器之前我没有做任何日志记录。
然而,替换这一行,
hdlr.setLevel(logging.DEBUG)
:
logging.root.setLevel(logging.DEBUG)
工作,当它明显(跳转到编辑)不应该吗?
一些背景信息:MyClass
是我正在工作的一个库。它的根__init__.py
不包含日志代码,(尽管我认为库应该在该文件中有一些日志相关的代码)。
如果消息从未到达处理程序,处理程序的级别是什么并不重要。默认情况下,根日志记录器级别为WARN;它不会将INFO或DEBUG消息分派给任何处理程序。当您将根记录器设置为DEBUG时,它将向处理程序发送DEBUG消息,然后处理程序可以根据其级别设置决定如何处理这些消息。
相关日志| error()被发送到FileHandler…但不包括其他日志级别