当前位置: 首页 > 面试题库 >

python日志记录处理程序中setLevel的意义是什么?

鲜于凯康
2023-03-14
问题内容

假设我有以下代码:

import logging
import logging.handlers

a = logging.getLogger('myapp')
h = logging.handlers.RotatingFileHandler('foo.log')
h.setLevel(logging.DEBUG)
a.addHandler(h)

# The effective log level is still logging.WARN
print a.getEffectiveLevel() 
a.debug('foo message')
a.warn('warning message')

我希望logging.DEBUG在处理程序上进行设置会导致将调试级别的消息写入日志文件。但是,这将打印有效级别的30(等于logging.WARNING,默认值),并且仅将warn消息记录到日志文件中,而不记录调试消息。

似乎该处理程序的日志级别被丢弃在地板上,例如,它被静默忽略。这让我感到奇怪,为什么要setLevel在处理程序上放所有东西?


问题答案:

它允许更好的控制。默认情况下,root记录程序已WARNING设置级别,这意味着它不会打印较低级别的消息(无论如何设置处理程序的级别!)。但是,如果您将根记录程序的级别设置为DEBUG,则确实会将消息发送到日志文件:

import logging
import logging.handlers

a = logging.getLogger('myapp')
a.setLevel(logging.DEBUG)   # set root's level
h = logging.handlers.RotatingFileHandler('foo.log')
h.setLevel(logging.DEBUG)
a.addHandler(h)
print a.getEffectiveLevel() 
a.debug('foo message')
a.warn('warning message')

现在,您要添加不记录调试信息的新处理程序的映像。您可以通过简单地设置处理程序日志记录级别来做到这一点:

import logging
import logging.handlers

a = logging.getLogger('myapp')
a.setLevel(logging.DEBUG)   # set root's level

h = logging.handlers.RotatingFileHandler('foo.log')
h.setLevel(logging.DEBUG)
a.addHandler(h)

h2 = logging.handlers.RotatingFileHandler('foo2.log')
h2.setLevel(logging.WARNING)
a.addHandler(h2)

print a.getEffectiveLevel() 
a.debug('foo message')
a.warn('warning message')

现在,日志文件foo.log将包含两条消息,而该文件foo2.log将仅包含警告消息。您可能对只包含错误级别消息的日志文件感兴趣,然后只需添加aHandler并将其级别设置为logging.ERROR,一切都使用相同的Logger

您可能会将Logger日志记录级别视为对给定的记录器 及其处理程序 “感兴趣”的消息的全局限制。记录器 随后
考虑的消息将发送到处理程序,它们执行自己的过滤和记录过程。



 类似资料:
  • 我刚刚在我的应用程序中实现了日志记录,我想知道是否有一种方法来检查日志记录程序是否为空。 我想到的是在我的脚本中设置两个处理程序: 一个用于带有级别的控制台 一个用于级别为的文件 在脚本的末尾,我需要检查logger是否不为空。这意味着在运行期间,记录了一些的消息,在这种情况下,我希望通过将调试级别的日志文件发送到我的邮箱。 这种检查在脚本本身中是否可能,而不需要shell重定向到文件?

  • 我想知道如何在Spring批处理中使用MCD记录诸如和之类的内容。 下面是一些代码: Bootstrap.properties 这个文件有我的主要方法。当我用手动设置这里的字段时,我在日志中看到了它,但我不明白如何将我需要的实际信息放在这里。 如果有任何见解,我将不胜感激:)谢谢。

  • 问题内容: 因此,现在我需要创建并实现Python日志记录模块的扩展,该扩展将用于登录到我们的数据库。基本上,我们有几个python应用程序(它们都在后台运行)当前登录到文本文件的随机混合。这几乎使得不可能确定某个应用程序是否失败。 给我的问题是将所说的日志记录文本文件移动到oracle数据库。这些表已经定义好了,需要记录到什么地方,但是现在,我正在寻找添加另一个将记录到数据库的记录处理程序。 我

  • 问题内容: 我正在编写一个服务器应用程序,该应用程序应该能够在控制台和日志文件上以不同级别登录。 问题是,如果设置了logging.basicConfig(),它将登录到控制台,但是必须在主线程中进行设置。 也可以使用logging.basicConfig(filename =’logger.log’)进行设置以写入文件。 设置用于控制台日志记录(logging.StreamHandler())或

  • 我正在使用python日志记录我的程序。所有日志当前都打印在stdout上,但我希望使用POST REST调用将它们发送到远程日志服务器。当前,我的程序发出了多个日志记录的POST请求。有没有更优化的方式发送日志,我可以捆绑多个日志在一个POST请求?

  • 问题内容: 因此,我有一个在Linux系统上运行的守护程序,我想要记录其活动:日志。问题是,完成此任务的“最佳”方法是什么? 我的第一个想法是简单地打开一个文件并将其写入。 用这种方式记录日志有天生的错误吗?有没有更好的方法,例如Linux内置的某些框架? 问题答案: Unix长期以来一直使用一种称为syslog的特殊日志记录框架。输入您的外壳 您将获得C接口的帮助。 一些 例子