在共享库中登录 Python 的最佳实践

mic*_*ich 8 python logging dependency-management

简而言之,我编写 ETL 管道。它们通常在高级脚本中描述。在其中,我使用不同的内部库(我们管理它们)来提供实用功能、工具或内部数据结构。

在处理从不同存储库导入的多个包时,有关日志记录的常见最佳实践是什么?

我的问题是:

1)我应该将日志放入库中吗?或者仅在顶级脚本中?

一方面,在某些库函数/类中显示一些信息可能很有用。另一方面,它强制库客户端使用特定的记录器。

我查了几个开源项目,好像根本没有日志。

2)如果我们确实将日志放入所有共享库中,那么Python中向所有内容传递唯一记录器的最佳实践是什么?

我希望我的日志记录格式和策略在每个库调用中保持一致,因为所有内容都作为“整体”的一部分运行。我应该在主脚本中初始化记录器并在我创建的每个对象中传递相同的记录器吗?对我来说这似乎是多余的。我看到了另一种模式,其中所有需要日志记录的类都将从日志记录类继承。在我看来,它可能会过度杀伤并使整体架构变得复杂。

我在另一个 stackoverflow 中读到,实际上每个记录器都是父包 logger 的子项。当包来自不同的存储库时如何应用它?

谢谢

blu*_*ues 6

将没有处理程序(或仅包含null handler)的记录器添加到库中,并用它执行所有内部日志记录。给它一个与库相关的名称。当您执行此操作时,任何使用该库的应用程序都可以获取记录器并添加处理程序以根据需要访问日志。

一个例子是 requests 库,它执行类似的操作。

import logging
import requests
r = logging.getLogger('requests')
r.addHandler(logging.StreamHandler())
r.setLevel(logging.DEBUG)
requests.get('http://stackoverflow.com')
Run Code Online (Sandbox Code Playgroud)

将打印

Starting new HTTP connection (1): stackoverflow.com
http://stackoverflow.com:80 "GET / HTTP/1.1" 301 143
Starting new HTTPS connection (1): stackoverflow.com
https://stackoverflow.com:443 "GET / HTTP/1.1" 200 23886
Run Code Online (Sandbox Code Playgroud)