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

我的目标是在系统日志(log)消息上设置警告级别,并在日志(log)文件中设置调试级别.

这是我的设置:

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

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

如果我将此行更改为:

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

那么这似乎确实起作用了,即文件包含所有消息,而系统日志(log)仅包含错误和警告消息.

我不明白为什么原始代码不能工作,因为我专门设置了文件处理程序的级别.

推荐答案

这是因为您需要在记录器上设置一个级别,因为这是首先判断的,如果有进一步的处理要完成,那么事件被传递给处理程序,在那里根据它们的级别进行判断.

  • 记录器上的级别-应用程序的总体详细程度
  • 处理程序上的级别-该处理程序表示的目标的详细信息

有关更多信息,请参见下图.

enter image description here

Python相关问答推荐

Django管理面板显示字段最大长度而不是字段名称

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

需要计算60,000个坐标之间的距离

非常奇怪:tzLocal.get_Localzone()基于python3别名的不同输出?

如何使用数组的最小条目拆分数组

将pandas Dataframe转换为3D numpy矩阵

Pandas:将多级列名改为一级

在含噪声的3D点网格中识别4连通点模式

Python Pandas获取层次路径直到顶层管理

判断solve_ivp中的事件

为什么if2/if3会提供两种不同的输出?

python中csv. Dictreader. fieldname的类型是什么?'

将链中的矩阵乘法应用于多组值

统计numpy. ndarray中的项目列表出现次数的最快方法

删除特定列后的所有列

你能把函数的返回类型用作其他地方的类型吗?'

极点替换值大于组内另一个极点数据帧的最大值

根据过滤后的牛郎星图表中的数据计算新系列

对列中的数字进行迭代,得到n次重复开始的第一个行号

跨两个数据帧收集非索引列上的公共组