为什么不记录`DEBUG`级输出什么?

时间:2016-11-02 18:58:08

标签: python debugging logging

我已经记录了一个文件:

[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'

2 个答案:

答案 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,)