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

发布于 2021-01-29 19:34:58

假设我有以下代码:

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在处理程序上放所有东西?

关注者
0
被浏览
89
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    它允许更好的控制。默认情况下,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日志记录级别视为对给定的记录器 及其处理程序 “感兴趣”的消息的全局限制。记录器 随后
    考虑的消息将发送到处理程序,它们执行自己的过滤和记录过程。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看