设置Python日志时遇到问题

3

我正在使用Python的标准日志系统来记录我的应用程序。我想要将所有类型的信息(从调试到严重)打印到控制台,但如果消息级别为错误或更高,则还想发送电子邮件。我一直在阅读有关日志记录的文档,但是有些困惑。我设置了以下测试,但似乎不正确:

 import logging

 log = logging.getLogger('my_test_log')
 sublog = logging.getLogger('my_test_log.sublog')

 log.setLevel(logging.ERROR)
 log.addHandler(logging.StreamHandler())

 sublog.addHandler(logging.StreamHandler())
 sublog.setLevel(logging.DEBUG)     

 sublog.debug('This is a debug message')
 sublog.info('This is an info message')
 sublog.warn('This is a warn message')
 sublog.error('This is an error message')
 sublog.critical('This is a critical message')

注意:我现在设置了两个日志都使用StreamHandler,因为我不想发垃圾邮件,但实际上它应该只打印错误和严重消息两次,而不是将其发送到电子邮件。在此情况下,我将在此工作后将其更改为SMTP以将其发送到电子邮件。

当我运行此代码时,这是我的输出:

This is a debug message
This is a debug message
This is an info message
This is an info message
This is a warn message
This is a warn message
This is an error message
This is an error message
This is a critical message
This is a critical message

基本上所有内容都会打印两次,而不仅仅是错误和关键信息。我这里做错了什么?谢谢!
2个回答

2
经过一些快速的研究,似乎处理程序对象不会自动使用其父记录器的日志级别。您需要自行设置级别
import logging

log = logging.getLogger('my_test_log')
sublog = logging.getLogger('my_test_log.sublog')

log.setLevel(logging.ERROR)
handler = logging.StreamHandler()
handler.setLevel(logging.ERROR)
log.addHandler(handler)

...

啊,好的,那就解释了为什么它不起作用。我刚试了一下,它可以工作!谢谢你! - still.Learning

0
你的问题在于子日志的级别设置为DEBUG。因此,你会收到所有的消息(只需更改为ERROR)。另外,logger.propagate为True存在问题。
这应该可以解决问题:
sublog.propagate = False

这将停止重复的消息。

请查看有关日志记录的文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接