usu*_* me 3 python logging python-2.7
我不了解根记录器和子记录器之间的相互作用:
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' )
Run Code Online (Sandbox Code Playgroud)
最后一行logger.info( 'hello' )应该是
logger因为它有logger.setLevel(logging.INFO) rootLogger因为它有rootLogger.setLevel( logging.CRITICAL )但是在脚本的结尾,我有一个root.log包含的文件hello。CRITICAL级别为何不阻止该消息rootLogger?
发生这种情况是因为该logger对象仅继承FileHandler您分配给的对象rootLogger,而不继承日志级别的对象。您的Logger对象设置了自己的日志级别,因此完全不会使用父级的日志级别。这意味着登录logger将先检查logger自身的日志级别(即INFO),然后再检查继承的日志级别FileHandler(即DEBUG)-它不会检查父rootLogger对象的日志级别。由于logger和FileHandler都设置为INFO级别或更高级别,因此您会看到'hello'日志记录。
如果您不想logger从继承处理程序rootLogger,请将对象的propagate属性设置为“ 0” logger:
logger = logging.getLogger( 'logger' )
logger.setLevel(logging.INFO)
logger.propagate = 0
Run Code Online (Sandbox Code Playgroud)
如果您希望子记录器继承父记录器的日志级别,请将子日志级别设置为NOTSET:
logger = logging.getLogger( 'logger' )
logger.setLevel(logging.NOTSET)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1708 次 |
| 最近记录: |