应该如何在Python包中使用日志记录?

Mar*_*oma 7 python logging

我目前正在开发一个可以在不编写任何新代码的情况下使用的软件包,这些模块可用于开发新代码(参见文档).

我的许多模块logging都以非常简单的方式使用:

import logging
import sys
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s',
                    level=logging.DEBUG,
                    stream=sys.stdout)
# Code of the module follows
Run Code Online (Sandbox Code Playgroud)

我在许多模块中都有这些行.在我看来,我应该考虑它,但我不确定最佳/推荐/最pythonic方式是什么.

日志记录文档中的相关部分似乎是为库配置日志记录从多个模块进行日志记录.

我想我应该简单地将行移动logging.basicConfig到可执行文件(bin/hwrt)并删除所有其他logging.basicConfig行.

有没有规则包应该如何使用日志记录(如PEP8的编码风格)?

如果其他开发人员使用我的代码,他们可能希望禁用/修改我的包进行日志记录的方式(这样它就不会与他们的日志记录调用混在一起).有没有办法帮助他们这样做?

Mar*_*ers 14

你的图书馆应该没有配置日志记录; 这是一个应用程序范围的任务.

相反,只需设置你的记录器对象__name__,使用它,就是这样.您使用的文档logging和使用您的库的开发人员可以使用标准loggingAPI来配置日志记录.

您可以向根记录器添加空处理程序(为程序包名称注册的记录器),以防止在应用程序未设置默认配置时使用默认配置:

# This goes into your library somewhere
logging.getLogger('name.of.library').addHandler(logging.NullHandler())
Run Code Online (Sandbox Code Playgroud)

然后,使用您的库的开发人员可以通过禁用日志传播来禁用您的库的所有日志记录:

logging.getLogger('name.of.library').propagate = False
Run Code Online (Sandbox Code Playgroud)

所有这些都已在logging模块中记录; 您可以将其视为Python日志记录的样式指南.从您已链接到的" 配置日志库"部分:

注意:强烈建议您不要将NullHandler以外的任何处理程序添加到库的记录器中.这是因为处理程序的配置是使用您的库的应用程序开发人员的特权.应用程序开发人员了解他们的目标受众以及哪些处理程序最适合他们的应用程序:如果您在"引擎盖下"添加处理程序,则可能会干扰他们执行单元测试和提供符合其要求的日志的能力.

logging.basicConfig()就是这样; 它创建处理程序配置.

  • @pyeR_biz:如果您正在构建一个库,您**不会创建日志配置**。在使用该库的*应用程序*中设置配置。您可以遵循“urllib3”示例,它们遵循[库的记录实践](https://docs.python.org/3/howto/logging.html#library-config)和[设置空处理程序](https ://github.com/urllib3/urllib3/blob/c5bc7163022c0ac2e765cdb7309937a53e32d368/src/urllib3/__init__.py#L45)。他们还有一个[辅助调试的实用程序](https://github.com/urllib3/urllib3/blob/c5bc7163022c0ac2e765cdb7309937a53e32d368/src/urllib3/__init__.py#L48-L63)。 (4认同)
  • @pyeR_biz:将其与 MusicBrainz Picard 等典型应用程序进行比较,该应用程序[配置日志记录](https://github.com/metabrainz/picard/blob/3ea43252c498bd27aa16ad5b7899c2b55c1027b5/picard/log.py)。 (3认同)