如何防止模块级日志记录功能破坏我的记录器?

时间:2014-03-03 05:57:42

标签: python logging

考虑这段代码,我在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。还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

  可怕的是,任何使用这些函数的模块(或调用logging.basicConfig)都会破坏我的其余日志记录

是的,可能,但这些模块不遵循良好实践(记录在案)。事实上,在上面的代码片段中,你做错了 - 你不应该将处理程序附加到记录器(NullHandler除外),除非在主脚本中调用来自if __name__ == '__main__的代码。导入代码不应该有副作用。

模块级便利功能适用于简短的脚本,简单的用法以及刚开始使用日志记录的人员。当日志记录要求超出此范围时,它们不适用。