python logging日志输出模块简要使用

前言

在我的前一篇博客《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)

到此,日志输出的基本操作你就掌握了,将他用于你的项目中把!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章