我不理解根记录器和子记录器之间的交互:
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
的消息?
答案 0 :(得分:4)
这种情况正在发生,因为logger
对象只继承了您分配给FileHandler
的{{1}}对象,而不是日志级别。您的rootLogger
对象设置了自己的日志级别,因此根本不会使用父级的日志级别。这意味着通过Logger
进行日志记录将检查logger
本身(logger
)的日志级别,然后检查继承的INFO
的级别(即{ {1}}) - 它不检查父FileHandler
对象的日志级别。由于DEBUG
和rootLogger
都设置为logger
级别或更高级别,因此您会看到FileHandler
被记录。
如果您不希望INFO
从'hello'
继承处理程序,请在logger
对象上将propagate
属性设置为'0':
rootLogger
如果您希望子记录器继承父级的日志级别,请将子日志级别设置为logger
:
logger = logging.getLogger( 'logger' )
logger.setLevel(logging.INFO)
logger.propagate = 0