![](/img/trans.png)
[英]Python root logger messages not being logged via handler configured with fileConfig
[英]How to avoid root handler being called from the custom logger in Python?
我有一个具有调试级别的日志记录模块的基本配置 - 现在我只想创建另一个具有错误级别的记录器。 我怎样才能做到这一点?
问题是除了错误处理程序之外还调用了根处理程序 - 这是我想要避免的事情。
import logging
fmt = '%(asctime)s:%(funcName)s:%(lineno)d:%(levelname)s:%(name)s:%(message)s'
logging.basicConfig(level=logging.DEBUG, format=fmt)
logger = logging.getLogger('Temp')
logger.setLevel(logging.ERROR)
handler = logging.StreamHandler()
handler.setLevel(logging.ERROR)
logger.addHandler(handler)
logger.error('boo')
上面的代码打印了两次 boo,而我只期望一次,我不知道如何处理这个烦人的问题......
In [4]: logger.error('boo')
boo
2021-04-26 18:54:24,329:<module>:1:ERROR:Temp:boo
In [5]: logger.handlers
Out[5]: [<StreamHandler stderr (ERROR)>]
root
logger:上级中的上级,做普通 logger 所做的所有事情,但不会将收到的日志传递给其他任何人。handler
:记录器的私人承包商,他实际上对日志做任何事情,例如。 格式化日志,将其写入文件或stdout
,或通过 tcp/udp 发送。formatter
:主题, handler
应用于日志的设计。basicConfig
:配置root
记录器的快捷方式。 当您希望他完成所有工作并且他的所有较低级别的伐木工只会将日志传递给他时,这很有用。basicConfig
将root
记录器的级别设置为WARNING
并将 output 日志添加到stderr
的StreamHandler
。format
并使用快捷方式basicConfig
来配置root
记录器。 您希望根记录器执行所有实际的记录操作Temp
ERROR
级别及以上的日志。StreamHandler
。 其中 output 默认为stdout
。ERROR
级别及以上Temp
记录器,这使得5.
多余,因为级别设置为3.
root
记录器从1.
开始就完成这项工作。!ERROR
。您的Temp
记录器接受了ERROR
级别的字符串boo
。 然后告诉它的处理程序处理字符串。 由于该处理程序没有分配任何formatter
,因此它按原样将字符串输出到stdout
: boo
之后, Temp
记录器将字符串boo
传递给他的上级,即root
记录器。
由于日志级别为ERROR
> WARNING
,因此root
记录器接受了日志。 然后root
记录器告诉其处理程序处理字符串boo
。 此处理程序将格式字符串应用于boo
。 添加时间戳,添加位置,添加通过日志的记录器的名称等。
最后将结果输出到stderr
: 2021-04-26 18:54:24,329:<module>:1:ERROR:Temp:boo
由于您的代码完全按照您的要求执行,因此您必须尽可能详细地告诉它。
basicConfig
。 通过删除basicConfig
行,您的问题解决了。logger = logging.getLogger('__name__')
以便记录器具有模块的名称。 查看日志并确切知道它来自哪个import path
。propagate
属性将它传递到链上。 在您的情况下, logger.propagate = False
也可以解决问题。root
并让根执行实际的日志记录。 为什么?
propagating=False
完全关闭特定记录器的日志记录。root
记录器,您就可以准确地知道代码中的所有处理程序和格式化程序。 您可以集中控制日志记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.