0

我的项目由许多命名空间包组成,我想为它们正确设置日志记录:它们旨在被其他“前端”用作库。

假设我有这种情况,对于包 foo.xyz:

 foo/
      __init__.py
      xyz/
          __init__.py
         bar.py
         baz.py

我的想法是保留生成日志的位置的信息,例如在 bar.py 中

import logging
log = logging.getLogger(__name__)
log.addHandler(logging.NullHandler()) # Python 2.7
log.setLevel(....)

但是我不确定如何从前端(从不同的包中导入几个位)调用它以轻松显示所有内容。例如,我正在使用 foo.abc 和 foo.xyz,按照上面的设置进行日志记录。我想使用传播,但目前这不起作用:

from foo.xyz import bar
from foo.abc import baz

log = logging.getLogger()
log.addHandler(logging.StreamHandler())
log.setLevel(logging.DEBUG)

do_my_stuff()

但是,库的记录器不会生成任何输出。我究竟做错了什么?

编辑:到目前为止,如果我得到与父模块的命名空间相对应的记录器,我可以获得输出:

log = logging.getLogger("foo.xyz")

但是,我试图在一次调用中获取所有内容:我想知道我是否可以这样做,因为正如我之前所写的,这组包使用命名空间。

4

2 回答 2

2

您不需要将 a 添加NullHandler到所有子包foo- 您只需将 NullHandler 添加到foo记录器,这可以在foo/__init__.py.

仅添加到库代码中以处理使用NullHandler库但使用应用程序未配置日志记录的情况。Thomas Vander Stichele 错误地指出添加 aNullHandler会导致消息被丢弃。

在您的应用程序中,您可以根据需要配置日志记录 - 任何处理程序、级别等。级别设置不应该(通常)在模块本身中完成,而是在某个中心位置完成,通常与此类似地调用:

if __name__ == '__main__':
    configure_logging() # whatever configuration you need to do
    main()

这允许在不打印日志的情况下使用 REPL(除了WARNING或以上),而在应用程序运行时会发生日志记录。

于 2012-09-11T17:32:20.553 回答
0

如果从 bar.py 中删除 addHandler 和 setLevel 会发生什么?我不明白为什么您希望您的程序包实际进行日志记录而不是生成日志消息,并且 NullHandler 听起来它会一起丢弃您的消息。

于 2012-09-06T08:52:47.067 回答