我已经记录了一个文件:
[loggers]
keys=root
[handlers]
keys=consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=INFO
handlers=consoleHandler
[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=%(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
然后,当我运行以下代码时,它不会打印dubug消息。那是为什么?
from logging import getLogger
from logging.config import fileConfig
fileConfig('/Users/zech/Dropbox/git/micronota/micronota/log.cfg')
l = getLogger()
l.setLevel('DEBUG')
l.debug('adfa')
l.info('info') # this works and outputs 'info'
答案 0 :(得分:3)
啊,我明白了!
您还需要在处理程序中设置级别。
在您的配置文件中,您的StreamHandler级别为INFO
。这意味着即使您的根记录器l
将发出l.debug('adfa')
消息,处理程序本身也不会注册它。这是为了让您可以更好地控制要记录的消息。例如,假设您想要两个处理程序:一个写入终端,另一个写入文件。在终端中,输出所有内容可能没问题,但是您可能会担心文件太大了,对吧?因此,您创建一个FileHandler,其级别设置为WARN
级别,因此您可以在代码中放置l.debug(...)
语句,这些语句将打印到控制台,但不会打印到文件中。
如果您不想更改配置文件,可以执行以下操作:
l = getLogger()
l.setLevel('DEBUG')
for handler in l.handlers:
handler.setLevel('DEBUG')
l.debug('adfa')
来自Python 3.1的文档(比较旧,但看起来我将在下面粘贴的句子在Python 3.5文档中删除了)
为什么有两个setLevel()方法?记录器中设置的级别确定将传递给其处理程序的消息的严重性。每个处理程序中设置的级别确定处理程序将发送哪些消息。
答案 1 :(得分:0)
您已将日志级别设置为INFO
。你可以替换:
[logger_root]
level=INFO
handlers=consoleHandler
[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,)
用
[logger_root]
level=DEBUG
handlers=consoleHandler
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)