python - python 日志记录处理程序中 setLevel 的意义是什么?

标签 python logging python-logging

假设我有以下代码:

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/

相关文章:

python - logging.config.dictConfig 的完整示例在哪里?

python - 如何在应用程序每次运行时创建一个新的日志文件?

asp.net - 我应该在 global.asax 中捕获所有异常吗?

postgresql - .NET Core 使用 NLog 记录到 PostgreSQL DB

java - Log4j 登录到多个文件

使用多线程 + 多处理的 Python 日志记录

python - Bash进程执行逻辑

python - Pyautogui 屏幕截图。它去哪儿了?如何保存以后查找?

python - 您如何连接到 AWS Elastic Transcoder?

python - R和Python的cov和cor的区别