考虑这段代码,我在Python 2.7.6下运行:
import logging, sys
assert (__name__ not in logging.Logger.manager.loggerDict)
logger = logging.getLogger(__name__)
stdout_handler = logging.StreamHandler(sys.stdout)
logger.addHandler(stdout_handler)
logger.error("You'll see this once")
logging.debug("Imagine logging now happens in some other module, maybe via an import")
logger.error("You'll see this twice")
logger.propagate = False
logger.error("BUT this you'll only see once")
它给出了这个输出:
You'll see this once
You'll see this twice
ERROR:__main__:You'll see this twice
BUT this you'll only see once
问题似乎是logging.debug调用logging.basicConfig:
以上模块级便捷功能,委托给 root logger,调用basicConfig()以确保至少有一个处理程序 可用(source)。
我想简单地忽略“不要使用模块级便捷功能”这一规则,但可怕的是,任何使用这些功能的模块(或调用logging.basicConfig)都会破坏其余部分我的记录。所以相反,教训可能是“总是使用传播= False用于父级是根记录器的记录器”,但这感觉不对 - 传播必须默认为True。还有更好的方法吗?
答案 0 :(得分:2)
可怕的是,任何使用这些函数的模块(或调用logging.basicConfig)都会破坏我的其余日志记录
是的,可能,但这些模块不遵循良好实践(记录在案)。事实上,在上面的代码片段中,你做错了 - 你不应该将处理程序附加到记录器(NullHandler
除外),除非在主脚本中调用来自if __name__ == '__main__
的代码。导入代码不应该有副作用。
模块级便利功能适用于简短的脚本,简单的用法以及刚开始使用日志记录的人员。当日志记录要求超出此范围时,它们不适用。