Python 为什么根日志记录器接受来自子日志记录器的日志?

Python 为什么根日志记录器接受来自子日志记录器的日志?,python,python-2.7,logging,Python,Python 2.7,Logging,我不理解根记录器和子记录器之间的交互: import logging formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 1. SOME LOGGER logger = logging.getLogger( 'logger' ) logger.setLevel(logging.INFO) # 2. ROOT LOGGER rootLogger = logging.g

我不理解根记录器和子记录器之间的交互:

import logging

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 1. SOME LOGGER
logger = logging.getLogger( 'logger' ) 
logger.setLevel(logging.INFO)

# 2. ROOT LOGGER
rootLogger = logging.getLogger()
rootLogger.setLevel( logging.CRITICAL )
fh = logging.FileHandler('root.log')
fh.setLevel( logging.DEBUG )
fh.setFormatter(formatter)
rootLogger.addHandler(fh)

#
logger.info( 'hello' ) 
最后一行
logger.info('hello')
应该是

  • logger
    接受,因为它具有
    logger.setLevel(logging.INFO)
  • rootLogger
    拒绝,因为它具有
    rootLogger.setLevel(logging.CRITICAL)

但是在脚本的末尾,我有一个文件
root.log
包含
hello
。为什么
临界
级别不阻止
根记录器
的消息?

之所以发生这种情况,是因为
记录器
对象仅继承您分配给
根记录器
文件处理程序
对象,而不是日志级别。您的
Logger
对象设置自己的日志级别,因此根本不会使用父级的日志级别。这意味着通过
记录器
进行日志记录将检查
记录器
本身的日志级别(即
信息
),然后检查继承的
文件处理程序
(即
调试
)的日志级别-它不检查父
根记录器
对象的日志级别。由于
logger
FileHandler
都设置为
INFO
级别或更高级别,因此您可以看到
'hello'
获取日志

如果不希望
logger
rootLogger
继承处理程序,请在
logger
对象上将属性设置为“0”:

logger = logging.getLogger( 'logger' ) 
logger.setLevel(logging.INFO)
logger.propagate = 0
如果希望子日志记录器继承父日志级别,请将子日志级别设置为
NOTSET

logger = logging.getLogger( 'logger' ) 
logger.setLevel(logging.NOTSET)