考虑一下我在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记录器,调用basicConfig()来确保至少有一个处理程序可用(源)。
我想简单地摆脱“不要使用模块级便捷功能”规则,但可怕的是,任何使用这些功能(或调用logging.basicConfig)的模块都会破坏其余的日志记录。因此,取而代之的是,课程可能是“对于以父级记录器为根的记录器始终使用property = False,”,但这并不对劲–传播必须出于某种原因默认为True。有没有更好的办法?
可怕的是,使用这些功能(或调用logging.basicConfig)的任何模块都会破坏其余的日志记录
是的,可以,但是那些模块不会遵循良好的做法(已记录)。实际上,在上面的代码段中,您做错了-NullHandler
除了if __name__ == '__main__
主脚本中调用的代码之外,您不应将处理程序附加到记录器(除外)。导入代码应该没有副作用。
模块级的便捷功能适用于简短的脚本,简单的用法以及刚开始使用日志的人员。当记录要求超出此范围时,不打算使用它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句