使用库进行Python日志记录(命名空间包)

时间:2012-09-06 08:44:28

标签: python logging

我的项目包含许多命名空间包,我想为它们正确设置日志:它们应该被其他“前端”用作库。

假设我有这个案例,对于包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")

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

2 个答案:

答案 0 :(得分:2)

您无需向NullHandler的所有子包添加foo - 您只需将NullHandler添加到foo记录器,这可以在{{{}}中完成1}}。

foo/__init__.py仅添加到库代码中以处理使用库但使用应用程序未配置日志记录的情况。 Thomas Vander Stichele声称添加NullHandler会导致邮件丢失,这是错误的。

在您的应用程序中,您可以根据需要配置日志记录 - 无论处理程序,级别等等。级别设置不应(通常)在模块本身中完成,但在某些中心位置,通常与此类似:

NullHandler

这允许在不记录日志的情况下使用REPL(if __name__ == '__main__': configure_logging() # whatever configuration you need to do main() 或更高版本除外),而在运行应用程序时会发生日志记录。

答案 1 :(得分:0)

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