假设我有以下代码:
import logging
import logging.handlers
a = logging.getLogger('myapp')
h = logging.handlers.RotatingFileHandler('foo.log')
h.setLevel(logging.DEBUG)
a.addHandler(h)
# The effective log level is still logging.WARN
print a.getEffectiveLevel()
a.debug('foo message')
a.warn('warning message')
我希望在处理程序上设置 logging.DEBUG
会导致调试级别消息写入日志文件。但是,这将打印 30 表示有效级别(等于默认值 logging.WARNING
),并且仅将 warn
消息记录到日志文件,而不是调试消息。
看来处理程序的日志级别正在下降,例如它被默默地忽略了。这让我想知道,为什么处理程序上有 setLevel
?
最佳答案
它允许更精细的控制。默认情况下,根记录器具有 WARNING
级别设置,这意味着它不会打印较低级别的消息(无论处理程序的级别如何设置!)。但是,如果您将根记录器的级别设置为 DEBUG
,消息确实被发送到日志文件:
import logging
import logging.handlers
a = logging.getLogger('myapp')
a.setLevel(logging.DEBUG) # set root's level
h = logging.handlers.RotatingFileHandler('foo.log')
h.setLevel(logging.DEBUG)
a.addHandler(h)
print a.getEffectiveLevel()
a.debug('foo message')
a.warn('warning message')
现在,想象一下您想要添加一个不记录调试信息的新处理程序。 您可以通过简单地设置处理程序日志记录级别来完成此操作:
import logging
import logging.handlers
a = logging.getLogger('myapp')
a.setLevel(logging.DEBUG) # set root's level
h = logging.handlers.RotatingFileHandler('foo.log')
h.setLevel(logging.DEBUG)
a.addHandler(h)
h2 = logging.handlers.RotatingFileHandler('foo2.log')
h2.setLevel(logging.WARNING)
a.addHandler(h2)
print a.getEffectiveLevel()
a.debug('foo message')
a.warn('warning message')
现在,日志文件 foo.log
将包含这两条消息,而文件 foo2.log
仅包含警告消息。您可能对仅包含错误级别消息的日志文件感兴趣,然后只需添加 Handler
并将其级别设置为 logging.ERROR
,一切都使用相同的 Logger
.
您可能会想到Logger
日志记录级别作为对给定记录器及其处理程序“感兴趣”的消息的全局限制。记录器考虑的消息随后被发送到处理程序,处理程序执行自己的过滤和日志记录过程。
关于python - python 日志记录处理程序中 setLevel 的意义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33396730/