这是崔斯特的第二十四篇原创文章
使用日志记录程序运行状态
日志 模块自2.3版本开始便是Python标准库的一部分。它被简洁的描述在 PEP 282。 众所周知,除了 基础日志指南 部分,该文档并不容易阅读。
日志的两个目的:
- 诊断日志 记录与应用程序操作相关的日志。例如,用户遇到的报错信息, 可通过搜索诊断日志获得上下文信息。
- 审计日志 为商业分析而记录的日志。从审计日志中,可提取用户的交易信息, 并结合其他用户资料构成用户报告或者用来优化商业目标。
… 或者打印?
当需要在命令行应用中显示帮助文档时, 打印
是一个相对于日志更好的选择。 而在其他时候,日志总能优于 打印
,理由如下:
- 日志事件产生的 日志记录 ,包含清晰可用的诊断信息,如文件名称、路径、函数名和行号等。
- 包含日志模块的应用,默认可通过根记录器对应用的日志流进行访问,除非您将日志过滤了。
- 可通过
logging.Logger.setLevel()
方法有选择地记录日志, 或可通过设置logging.Logger.disabled
属性为True
来禁用。
库中的日志
日志指南 中含 库日志配置 的说明。由于是 用户 ,而非库来指明如何响应日志事件, 因此这里有一个值得反复说明的忠告:
注解
强烈建议不要向您的库日志中加入除NullHandler外的其它处理程序。
在库中,声明日志的最佳方式是通过 __name__
全局变量: logging 模块通过点(dot)运算符创建层级排列的日志,因此,用 __name__
可以避免名字冲突。
以下是一个来自 requests 资源 的最佳实践的例子 —— 把它放置在您的 __init__.py
文件中
应用程序中的日志
应用程序开发的权威指南, 应用的12要素 ,也在其中一节描述了 日志的作用 。它特别强调将日志视为事件流, 并将其发送至由应用环境所处理的标准输出中。
配置日志至少有以下三种方式:
- 使用INI格式文件:
- 优点: 使用 logging.config.listen() 函数监听socket,可在运行过程中更新配置
- 缺点: 通过源码控制日志配置较少( 例如 子类化定制的过滤器或记录器)。
- 使用字典或JSON格式文件:
- 优点: 除了可在运行时动态更新,在Python 2.6之后,还可通过 json 模块从其它文件中导入配置。
- 缺点: 很难通过源码控制日志配置。
- 使用源码:
- 优点: 对配置绝对的控制。
- 缺点: 对配置的更改需要对源码进行修改。
通过INI文件进行配置的例子
我们假设文件名为 logging_config.ini
。关于文件格式的更多细节,请参见 日志指南 中的 日志配置 部分。
|
|
然后在源码中调用 logging.config.fileConfig()
方法:
通过字典进行配置的例子
Python 2.7中,您可以使用字典实现详细配置。PEP 391 包含了一系列字典配置的强制和 非强制的元素。
通过源码直接配置的例子
|
|
官方文档说完了,来看看具体的应用。
默认的日志级别设置为 WARNING
(日志级别等级 CRITICAL
> ERROR
> WARNING
> INFO
> DEBUG
> NOTSET
), 小于 WARNING
级别的日志都不输出, 大于等于 WARNING
级别的日志都会输出。
简单的将日志打印到屏幕
|
|
输出:
test.log
文件中包含:
注意:由于日志写入模式设置为 w
,因此重复运行时会将之前的日志清空。
logging.basicConfig 函数各参数:
|
|
logging 三大模块: Logger
, Handler
, Format
logger
logger
通过 getLogger
函数得到, 可以在不同的模块中使用不同的 logger
Handler
handler
有多种, 可以记录到 console
, 或者到文件, 文件也可以自动 rotate
, 常用的几个 handler
- StreamHandler 打印到终端
- FileHandler 保存到文件
- RotatingFileHandler 保存到文件, 达到一定大小之后备份文件。
- TimedRotatingFileHandler 定时备份
Format
Formatter
对象设置日志信息最后的规则、结构和内容,默认的时间格式为 %Y-%m-%d %H:%M:%S
Scrapy 与 Logging
Scrapy uses Python’s builtin logging system for event logging. We’ll provide some simple examples to get you started, but for more advanced use-cases it’s strongly suggested to read thoroughly its documentation.
Scrapy使用Python的内置日志记录系统进行事件日志记录。 我们将提供一些简单的示例来帮助您开始,但对于更高级的用例,强烈建议您仔细阅读其文档。
Log levels
- logging.CRITICAL - for critical errors (highest severity)
- logging.ERROR - for regular errors
- logging.WARNING - for warning messages
- logging.INFO - for informational messages
- logging.DEBUG - for debugging messages (lowest severity)
How to log messages
quick example
|
|
Logging from Spiders
该记录器是使用Spider的名称创建的,但是您可以使用任何您想要的自定义Python记录器。 例如:
|
|
在middlewares中应用
|
|
使用Scrapy记录爬取日志
在 settings.py
中修改:
然后开始运行爬虫,日志不会打印,会保存到 scrapy_log.txt
文件中。
使用errbacks在请求处理中捕获异常
请求的errback是在处理异常时被调用的函数。
它接收Twisted Failure实例作为第一个参数,可用于跟踪连接建立超时,DNS错误等。
这里有一个爬虫日志记录所有的错误和捕捉一些特定的错误,例子:
|
|