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

时间:2014-11-19 12:29:04

标签: python logging

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

我的许多模块都以非常简单的方式使用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

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

日志记录文档中的相关部分似乎是Configuring Logging for a LibraryLogging from multiple modules

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

是否有任何规则包应该如何使用日志记录(如PEP8用于编码样式)?

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

1 个答案:

答案 0 :(得分:8)

您的库配置日志记录;这是一个应用程序范围的任务。

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

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

# This goes into your library somewhere
logging.getLogger('name.of.library').addHandler(logging.NullHandler())

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

logging.getLogger('name.of.library').propagate = False

所有这些都已在logging模块中记录;您可以将其视为Python日志记录的样式指南。来自您已链接到的Configuring Logging for a Library section

  

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

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