每次我认为我理解了日志记录模块时,gremlins会进来并改变它的工作方式。 (好吧,我承认,gremlin可能是我改变我的代码。)
我在这里做错了什么?
> ipython
> import logging
> log = logging.Logger("base")
> log.addHandler(logging.StreamHandler())
> log.critical("Hi")
Hi
> log2 = log.getChild("ment")
> log2.critical("hi")
No handlers could be found for logger "base.ment"
我本可以发誓过去,我能够在没有额外配置的情况下使用儿童记录器......
答案 0 :(得分:8)
如果你改变了
log = logging.Logger('base')
到
log = logging.getLogger('base')
然后它起作用:
import logging
log = logging.getLogger('base')
log.addHandler(logging.StreamHandler())
log.critical('Hi')
log2 = log.getChild('ment')
log2.critical('hi')
产量
Hi
hi
答案 1 :(得分:2)
更多细节:您使用的模块错误。 :)通过查看模块代码,看起来他们不希望您直接创建logging.Logger()
。模块上直接可用的许多函数(ex getLogger()
)和logging.Logger()
上的方法(ex getChild()
)实际上通过模块创建的logging.Manager
实例进行代理进口。当您直接使用Logger
创建logging.Logger()
时,实际上是在Logger
之外创建Manager
个实例。当您随后调用log.getChild()
时,模块实际上是在Manager
内创建新的记录器,但名称为Manager
- 外部记录器附加在记录器名称的前面。因此,添加到log
的处理程序不在Manager
中与生成的子项,因此处理程序不起作用。我仍然有点困惑,但为什么在创建log
之前或之后向log2
添加处理程序会导致对log2
的日志记录行为不同。我不明白是什么造成了......