配置子记录器

时间:2012-07-27 21:32:05

标签: python logging

每次我认为我理解了日志记录模块时,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"

我本可以发誓过去,我能够在没有额外配置的情况下使用儿童记录器......

2 个答案:

答案 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的日志记录行为不同。我不明白是什么造成了......