前言
在我的前一篇博客《spyder for python调试功能》中其实调试存在一些问题:假如你是使用模板建立项目(比如Scrapy爬虫项目),项目是在外部运行的,难以在编辑器实现调试功能。但是,为了不暴露我的实力,我还是拒绝使用print
这就要介绍日志了,
相信你多多少少打开过一些日志文件,里面密密麻麻都是时间和时间。
而python内置也有输出这样一些文件的模块logging
使用场景
假如你的代码是处理500000张图片,对他们进行统一大小。那么,你要知道,其中一些文件可能是损坏的,你需要记录!而当很多图片都有错误时,你不可能靠输出错误到控制台再手工复制寻找有问题的图片,况且,可能还有一些其他的信息要输出。
正文
该模块的基本使用包括
- 定义输出格式
- 输出到控制台
- 输出到文件
- 捕获异常
最简单的示例—输出到控制台
import logging
#logging.basicConfig(level=logging.DEBUG)
logging.debug("调试信息")
logging.info("普通信息")
logging.warning("警告信息")
logging.error("错误信息")
logging.critical("严重错误信息")
输出(控制台)
WARNING:root:警告信息
ERROR:root:错误信息
CRITICAL:root:严重错误信息
日志的级别
critical>error>warning>info>debug
所以你要根据你信息的重要程度选择级别
默认只有warning级别及以上的才会输出(上面注释那条命令就是把输出级别定为debug)
注
文件直接在spyder运行会有问题,比如还是输出不了debug级别,还有下面要介绍的时间,文件也输出不了,所以学习时建议在cmd运行py文件
定义输出格式
最简单的就是再修改上面注释那条代码
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
"""
修改这代码后运行最初代码,输出为
2018-10-30 21:58:58,221 - untitled0.py[line:10] - DEBUG: 调试信息
2018-10-30 21:58:58,221 - untitled0.py[line:11] - INFO: 普通信息
2018-10-30 21:58:58,222 - untitled0.py[line:12] - WARNING: 警告信息
2018-10-30 21:58:58,222 - untitled0.py[line:13] - ERROR: 错误信息
2018-10-30 21:58:58,222 - untitled0.py[line:14] - CRITICAL: 严重错误信息
这里format就是定义一个输出的格式化信息
"""
format常用格式表
输出说明 | 对应代码 | 解释 |
---|---|---|
时间 | %(asctime)s | 固定写法 |
信息级别 | %(levelname)s | format内,除了这里面的特殊变量 , |
文件名 | %(filename)s | 其他照样输出 |
代码所在行数 | %(lineno)d | ---- |
文件路径 | %(pathname)s | ---- |
函数名称 | %(funcName)s | ---- |
信息主体 | %(message)s | ---- |
输出到文件
输出到文件需要稍微复杂一丢丢
import logging
file_log = './.log' ##输出的文件名
formatter = logging.Formatter("%(asctime)s - %(filename)s - [line:%(lineno)d] - %(levelname)s: %(message)s") ##输出的格式
"""首先实例化一个对象log"""
log = logging.getLogger()
log.setLevel(logging.DEBUG) ##设置总的最低输出级别
"""在定义一个输出到文件的处理器"""
FileHandler = logging.FileHandler(file_log, mode='w') ##以写的模式,绑定了文件
FileHandler.setLevel(logging.WARNING) ##设置输出到文件的最低输出级别
FileHandler.setFormatter(formatter) ##设置输出到文件的格式
log.addHandler(FileHandler) ##添加到对象log
"""在定义一个输出到控制台的处理器"""
CmdHandler = logging.StreamHandler()
CmdHandler.setLevel(logging.DEBUG) ##设置输出到控制台的最低输出级别
CmdHandler.setFormatter(formatter) ##设置输出到控制台的格式
log.addHandler(CmdHandler) ##添加到对象log
"""添加了两个处理器,这将会同时输出到文件和控制台,如果需要舍弃就删除对应处理器即可"""
log.debug("调试信息")
log.info("普通信息")
log.warning("警告信息")
log.error("错误信息")
log.critical("严重错误信息")
捕获异常
这很简单
只需在上面代码基础上追加
try:
open('/????/exist', 'rb')
except Exception as e:
log.error('Failed to open file', exc_info=True)
"""
输出信息:
untitled0.py--2018-10-30 22:35:38,381 - [line:20] - WARNING: 警告信息
untitled0.py--2018-10-30 22:35:38,381 - [line:21] - ERROR: 错误信息
untitled0.py--2018-10-30 22:35:38,382 - [line:22] - CRITICAL: 严重错误信息
untitled0.py--2018-10-30 22:35:38,383 - [line:27] - ERROR: Failed to open file
Traceback (most recent call last):
File "untitled0.py", line 25, in <module>
open('/path/to/does/not/exist', 'rb')
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/does/not/exist'
"""
别以为最后面是普通的错误输出!!!
exc_info=True 意思是把错误信息也一起输出
当然你也可以
try:
open('/path/to/does/not/exist', 'rb')
except Exception as e:
log.error(e)
到此,日志输出的基本操作你就掌握了,将他用于你的项目中把!