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

时间:2014-09-02 16:12:10

标签: 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.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。为什么CRITICAL级别阻止rootLogger的消息?

1 个答案:

答案 0 :(得分:4)

这种情况正在发生,因为logger对象只继承了您分配给FileHandler的{​​{1}}对象,而不是日志级别。您的rootLogger对象设置了自己的日志级别,因此根本不会使用父级的日志级别。这意味着通过Logger进行日志记录将检查logger本身(logger)的日志级别,然后检查继承的INFO的级别(即{ {1}}) - 它不检查父FileHandler对象的日志级别。由于DEBUGrootLogger都设置为logger级别或更高级别,因此您会看到FileHandler被记录。

如果您不希望INFO'hello'继承处理程序,请在logger对象上将propagate属性设置为'0':

rootLogger

如果您希望子记录器继承父级的日志级别,请将子日志级别设置为logger

logger = logging.getLogger( 'logger' ) 
logger.setLevel(logging.INFO)
logger.propagate = 0