日志记录
优质
小牛编辑
141浏览
2023-12-01
logging
模块自 2.3 版以来一直是 Python 标准库的一部分。在 PEP 282 中有对它的简洁描述。除了 基础日志教程 之外,这些文档是非常难以阅读的。
日志记录一般有两个目的:
- 诊断日志 记录与应用程序操作相关的日志。例如,当用户遇到程序报错时, 可通过搜索诊断日志以获得上下文信息。
- 审计日志 为商业分析而记录的日志。从审计日志中,可提取用户的交易信息, 并结合其他用户资料构成用户报告,或者用来作为优化商业目标的数据支撑。
... 或者使用打印(print)?
当需要在命令行应用中显示帮助文档时, print
是一个相对于日志更好的选择。 而在其他时候,日志总能优于 print
,理由如下:
- 日志事件产生的 日志记录 ,包含清晰可用的诊断信息,如文件名称、路径、函数名和行号等。
- 包含日志模块的应用,默认可通过根记录器对应用的日志流进行访问,除非你做了日志过滤。
- 可通过
logging.Logger.setLevel()
方法有选择地记录日志, 或可通过设置logging.Logger.disabled
属性为True
来禁用日志记录。
在库中记录日志
官方的 日志指南 里有相关的 库日志配置 的说明。由于是 用户
,而非库来指定如何响应日志事件, 因此这里有一个值得反复说明的忠告:
注意强烈建议不要向您的库日志中加入除 NullHandler 外的其它处理程序。
在库中,声明日志的最佳方式是通过 __name__
全局变量: logging
模块通过点(.
)运算符创建层级排列的日志,因此,用 __name__
可以避免名字冲突。
以下是一个来自 requests 资源 的最佳实践的例子 ------ 请将它放置在 __init__.py
文件中:
import logging
logging.getLogger(__name__).addHandler(logging.NullHandler())
在应用程序中记录日志
应用程序开发的权威指南 《twelve factor app》 也在其中一节描述了 日志的作用 。它特别强调将日志视为事件流, 并将其发送至取决于应用环境配置的标准输出中。
至少有以下三种配置日志方式:
使用 INI 格式文件:
- 优点 :使用
logging.config.listen()
函数监听 socket,可在运行过程中更新配置 - 缺点 :相比代码里控制,可控性要弱(
例如
子类化定制的filters
或loggers
)。
使用字典或 JSON 格式文件:
- 优点 :除了可在运行时动态更新,在 Python 2.6 之后,还可通过
json
模块从其它文件中导入配置。 - 缺点 :相比代码里控制,可控性要弱
使用代码控制:
- 优点 :相比配置来讲,有绝对的控制。
- 缺点 :需要对源码进行修改。