在共享库中登录 Python 的最佳做法
Best practices for logging in Python in shared libraries
简而言之,我编写 ETL 管道。它们通常在高级脚本中进行描述。在它们中,我使用不同的内部库(我们管理它们)提供实用功能、工具或内部数据结构。
在处理从不同存储库导入的多个包时,有关日志记录的常见最佳做法是什么?
我的问题是:
1) 我应该将日志放入库中吗?还是仅在顶级脚本中?
一方面,显示某些库中的某些信息可能很有用 functions/classes。另一方面,它强加了特定记录器的库客户端使用。
查了几个开源项目,好像根本就没有日志。
2) 如果我们确实将日志放在所有共享库中,Python 中将唯一记录器传递给所有内容的最佳实践是什么?
我希望我的日志记录格式和策略在每个库调用中保持一致,因为所有内容都是 运行 作为 "as a whole" 的一部分。我应该在主脚本中初始化我的记录器并在我创建的每个对象中传递相同的记录器吗?这对我来说似乎是多余的。我看到了另一种模式,其中所有需要日志记录的 classes 都将从日志记录 class 继承。在我看来,它可能会矫枉过正并使整体架构复杂化。
我在另一个 Whosebug 中读到,实际上每个记录器都是父包记录器的子项。当包来自不同的存储库时如何应用它?
谢谢
向库中添加一个没有处理程序(或只有 null handler)的记录器,并使用它进行所有内部记录。给它一个与库相关的名称。当您这样做时,任何使用该库的应用程序都可以获取记录器并添加处理程序以根据需要访问日志。
一个例子是请求库,它做类似的事情。
import logging
import requests
r = logging.getLogger('requests')
r.addHandler(logging.StreamHandler())
r.setLevel(logging.DEBUG)
requests.get('http://whosebug.com')
将打印
Starting new HTTP connection (1): whosebug.com
http://whosebug.com:80 "GET / HTTP/1.1" 301 143
Starting new HTTPS connection (1): whosebug.com
https://whosebug.com:443 "GET / HTTP/1.1" 200 23886
简而言之,我编写 ETL 管道。它们通常在高级脚本中进行描述。在它们中,我使用不同的内部库(我们管理它们)提供实用功能、工具或内部数据结构。
在处理从不同存储库导入的多个包时,有关日志记录的常见最佳做法是什么?
我的问题是:
1) 我应该将日志放入库中吗?还是仅在顶级脚本中?
一方面,显示某些库中的某些信息可能很有用 functions/classes。另一方面,它强加了特定记录器的库客户端使用。
查了几个开源项目,好像根本就没有日志。
2) 如果我们确实将日志放在所有共享库中,Python 中将唯一记录器传递给所有内容的最佳实践是什么?
我希望我的日志记录格式和策略在每个库调用中保持一致,因为所有内容都是 运行 作为 "as a whole" 的一部分。我应该在主脚本中初始化我的记录器并在我创建的每个对象中传递相同的记录器吗?这对我来说似乎是多余的。我看到了另一种模式,其中所有需要日志记录的 classes 都将从日志记录 class 继承。在我看来,它可能会矫枉过正并使整体架构复杂化。
我在另一个 Whosebug 中读到,实际上每个记录器都是父包记录器的子项。当包来自不同的存储库时如何应用它?
谢谢
向库中添加一个没有处理程序(或只有 null handler)的记录器,并使用它进行所有内部记录。给它一个与库相关的名称。当您这样做时,任何使用该库的应用程序都可以获取记录器并添加处理程序以根据需要访问日志。
一个例子是请求库,它做类似的事情。
import logging
import requests
r = logging.getLogger('requests')
r.addHandler(logging.StreamHandler())
r.setLevel(logging.DEBUG)
requests.get('http://whosebug.com')
将打印
Starting new HTTP connection (1): whosebug.com
http://whosebug.com:80 "GET / HTTP/1.1" 301 143
Starting new HTTPS connection (1): whosebug.com
https://whosebug.com:443 "GET / HTTP/1.1" 200 23886