Python共享库中记录日志的最佳实践

7
简而言之,我编写ETL管道。它们通常在高级脚本中描述。在这些脚本中,我使用不同的内部库(我们管理它们),提供实用函数、工具或内部数据结构。
处理多个从不同仓库导入的软件包时,记录日志的常见最佳实践是什么?
我的问题是:
1)我应该将日志放在库中吗?还是只放在顶层脚本中?
一方面,在某些库函数/类中显示一些信息可能很有用。另一方面,它会强制库客户端使用特定的记录器。
我查看了一些开源项目,似乎根本没有记录日志。
2)如果我们确实将日志放在所有共享库中,Python中传递唯一记录器的最佳实践是什么?
我希望我的日志格式和策略在每个库调用中保持一致,因为所有内容都作为“整体”运行。我应该在主脚本中初始化我的记录器,并将相同的记录器传递给我创建的每个对象吗?这对我来说似乎是多余的。我看到另一个模式,所有需要日志记录的类都将继承自日志记录类。对我来说,这似乎可能过度设计并使整体架构变得复杂。
我在另一个stackoverflow中读到实际上,每个记录器都是父级包记录器的子级。当软件包来自不同的仓库时,如何应用它?
谢谢

不要把日志放在核心库中,最好是在调用核心库包的主脚本中添加日志。 - sahasrara62
@prashantrana 为什么这不是一个好主意呢?即使是标准库包,例如 multiprocessing,也会设置使用日志记录,以便开发人员可以选择激活它,而不必在他们不拥有的模块中进行操作。 - shmee
1
请参阅stdlib文档中的为库配置日志记录 - hoefling
@shmee,核心库指的是,假设你正在使用TensorFlow或Pandas,并且你知道它们可以正常工作并完成任务,你不需要在核心库中添加日志记录数据流程,比如abc。你需要在代码中使用那些库/函数的点处进行日志记录,例如logging.info('传递数据到xyz函数')等。 - sahasrara62
这篇文章提供了一般的最佳实践,不是针对Python特定的,但在设计日志系统时应该考虑这些原则。 - Ham
1个回答

5
向库中添加一个没有处理程序(或仅有null handler)的记录器,并使用它进行所有内部日志记录。 给它一个与库相关的名称。 这样做可以让任何使用该库的应用程序获取记录器并添加处理程序以根据需要访问日志。
一个例子是requests库,它执行类似的操作。
import logging
import requests
r = logging.getLogger('requests')
r.addHandler(logging.StreamHandler())
r.setLevel(logging.DEBUG)
requests.get('http://stackoverflow.com')

将打印
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接