设置python日志时出错

2024-09-29 17:13:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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

基本上,所有内容都会打印两次,而不仅仅是错误和关键信息。我做错什么了?谢谢!你知道吗


Tags: debuginfoanlog消息messageislogging
2条回答

您的问题是您在子日志上设置了要调试的级别。因此,您将得到所有消息(只需更改为ERROR)。另外,还有一个问题记录器.传播是真的。你知道吗

这应该可以解决:

sublog.propagate = False

这将停止重复消息。你知道吗

查看有关logging here的文档。你知道吗

经过一些快速的研究,似乎Handler对象不会自动使用其父记录器的日志级别。你得set the level yourself。你知道吗

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)

...

相关问题 更多 >

    热门问题