将日志记录 basicConfig 与多个处理程序一起使用

joh*_*mcp 4 python logging error-logging

我试图了解将 basicConfig 与多个处理程序一起使用时日志记录模块的行为。

我的目标是对系统日志消息设置警告级别,对日志文件设置调试级别。

这是我的设置:

import logging
import logging.handlers
import os
from datetime import datetime
 
log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
f_handler = logging.FileHandler(f'{os.path.expanduser("~")}/logs/test_{datetime.now().strftime("%Y%m%d%H%M%S")}.log')
s_handler = logging.handlers.SysLogHandler(address='/dev/log')


f_handler.setLevel(logging.DEBUG)
s_handler.setLevel(logging.WARN)
f_handler.setFormatter(log_format)
s_handler.setFormatter(log_format)

logging.basicConfig(handlers=[f_handler, s_handler])

print (logging.getLogger().getEffectiveLevel())


logging.warning('This is a warning')
logging.error('This is an error')
logging.info('This is an info')
logging.debug('This is debug')
Run Code Online (Sandbox Code Playgroud)

这不起作用 - 我的日志文件仅包含警告和错误消息,而不是预期的调试和信息消息。

如果我将此行更改为:

logging.basicConfig(handlers=[f_handler, s_handler], level=logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

那么这似乎确实有效,即该文件包含所有消息,而系统日志仅包含错误和警告消息。

我不明白为什么原始代码不起作用,因为我专门在文件处理程序上设置了级别。

Vin*_*jip 5

这是因为您需要在记录器上设置一个级别,因为首先会检查该级别,如果需要进行进一步的处理,则该事件将传递给处理程序,并在处理程序中根据其级别进行检查。

  • 记录器级别 - 应用程序的整体详细程度
  • 处理程序级别 - 该处理程序所代表的目标的详细程度

请参阅下图了解更多信息。

在此输入图像描述