Python 程序员必须掌握的日志记录


Posted in Python onAugust 17, 2020

写在之前

在我们的现实生活中,「日志记录」其实是一件非常重要的事情,比如银行的转账记录,汽车的行车记录仪记录行驶过程中的一切,如果出现了什么问题,我们可以通过「日志记录」来搞清楚到底发生了什么事情。

除了在生活中,在日常的系统开发以及调试等过程中,记录日志同样是一件很重要的事情。很多编程初学者并没有「记录日志」的习惯,认为记录日志是一件可有可无的事情,出现问题的时候只要使用 print 函数打印一下程序的中间结果即可,真是 too young too naive。只是 print 的话对于简单的脚本程序来说或许可行,可是到了碰到复杂的系统,你如果还是只用 print 这种方式的话,你会看到大量的消息,看到吐也不一定能找到其中有用的消息。

「日志」是一个系统的重要组成部分,用来记录用户操作、系统运行状态和错误信息,它的好坏直接影响到系统出现问题时定位的速度,有日志记录,我们可以在服务崩溃的时候很快的通过查看日志来发现问题出现的地方,同样也可以通过对日志的观察和分析,提前发现系统可能存在的风险。

Python 的标准日志模块

上面我们说了「日志」是如此的重要,作为无所不能的 Python 当然也有日志相关的功能,Python 标准库中提供了 logging 模块供我们使用。在最简单的使用中,默认情况下 logging 将日志打印到屏幕终端,我们可以直接导入 logging 模块,然后调用 debug,info,warn,error 和 critical 等函数来记录日志,默认日志的级别为 warning,级别比 warning 高的日志才会被显示(critical > error > warning > info > debug),「级别」是一个逻辑上的概念,用来区分日志的重要程度。

import logging

logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')

上述代码的执行结果如下所示:

WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message

我在上面说过,用 print 的话会产生大量的信息,从而很难从中找到真正有用的信息。而 logging 中将日志分成不同的级别以后,我们在大多数时间只保存级别比较高的日志信息,从而提高了日志的性能和分析速度,这样我们就可以很快速的从一个很大的日志文件里找到错误的信息。

配置日志格式

我们在用 logging 来记录日志之前,先来进行一些简单的配置:

import logging

logging.basicConfig(filename= 'test.log', level= logging.INFO)

logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')

上面的例子中,我是用 basicConfig 对日志进行了简单的配置,其实我们还可以进行更为复杂些的配置,在此之前,我们先来了解一下 logging 中的几个概念:

  • Logger:日志记录器,是应用程序中可以直接使用的接口。
  • Handler:日志处理器,用以表明将日志保存到什么地方以及保存多久。
  • Formatter:格式化,用以配置日志的输出格式。

上述三者的关系是:一个 Logger 使用一个 Handler,一个 Handler 使用一个 Formatter。那么概念我们知道了,该如何去使用它们呢?我们的 logging 中有很多种方式来配置文件,简单的就用上面所说的 basicConfig,对于比较复杂的我们可以将日志的配置保存在一个配置文件中,然后在主程序中使用 fileConfig 读取配置文件。

基本的知识我们知道了,下面我们来做一个小的题目:日志文件保存所有 debug 及其以上级别的日志,每条日志中要有打印日志的时间,日志的级别和日志的内容。请先自己尝试着思考一下,如果你已经思考完毕请继续向下看:

import logging

logging.basicConfig(
  level= logging.DEBUG,
  format = '%(asctime)s : %(levelname)s : %(message)s',
  filename= "test.log"
)

logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')

上述代码的一次运行结果如下:

2018-10-19 22:50:35,225 : DEBUG : debug message
2018-10-19 22:50:35,225 : INFO : info message
2018-10-19 22:50:35,225 : WARNING : warn message
2018-10-19 22:50:35,225 : ERROR : error message
2018-10-19 22:50:35,225 : CRITICAL : critical message

我刚刚在上面说过,对于比较复杂的我们可以将日志的配置保存在一个配置文件中,然后在主程序中使用 fileConfig 读取配置文件。下面我们就来看一个典型的日志配置文件(配置文件名为 logging.conf):

[loggers]
keys = root

[handlers]
keys = logfile

[formatters]
keys = generic

[logger_root]
handlers = logfile

[handler_logfile]
class = handlers.TimedRotatingFileHandler
args = ('test.log', 'midnight', 1, 10)
level = DEBUG
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s] %(message)s

在上述的日志配置文件中,首先我们在 [loggers] 中声明了一个叫做 root 的日志记录器(logger),在 [handlers] 中声明了一个叫 logfile 的日志处理器(handler),在 [formatters] 中声明了一个名为 generic 的格式化(formatter)。之后在 [logger_root] 中定义 root 这个日志处理器(logger) 所使用的日志处理器(handler) 是哪个,在 [handler_logfile] 中定义了日志处理器(handler) 输出日志的方式、日志文件的切换时间等。最后在 [formatter_generic] 中定义了日志的格式,包括日志的产生时间,级别、文件名以及行号等信息。

有了上述的配置文件以后,我们就可以在主代码中使用 logging.conf 模块的 fileConfig 函数加载日志配置:

import logging
import logging.config

logging.config.fileConfig('logging.conf')

logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')

上述代码的运行一次的结果如下所示:

2018-10-19 23:00:02,809 WARNI [root:8] warn message
2018-10-19 23:00:02,809 ERROR [root:9] error message
2018-10-19 23:00:02,809 CRITI [root:10] critical message

写在之后

正如标题中所说的那样,我认为「日志记录」是每个 Python 程序员必须要知道且学会的东西,也是每个程序员必须具备的意识。如果你之前没有使用过日志亦或者说不知道该怎么去使用日志记录,这篇文章我相信会给你带来一些帮助。

Python 的日志库设计之好,用起来之灵活,可以说是 Python 标准库中相当优秀的存在。当然上面我们所说的只是 Python 日志库中很少的一部分,更多的操作和内容还需要你在今后的学习和实践中自己去发掘和运用。

The end。

以上就是Python 程序员必须掌握的日志记录的详细内容,更多关于python 日志的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
浅析Python中return和finally共同挖的坑
Aug 18 Python
django实现同一个ip十分钟内只能注册一次的实例
Nov 03 Python
Python数据结构之哈夫曼树定义与使用方法示例
Apr 22 Python
python 获取等间隔的数组实例
Jul 04 Python
django foreignkey(外键)的实现
Jul 29 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
python 多维高斯分布数据生成方式
Dec 09 Python
Python Pickle 实现在同一个文件中序列化多个对象
Dec 30 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
python爬虫数据保存到mongoDB的实例方法
Jul 28 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
Aug 17 #Python
Python 如何查找特定类型文件
Aug 17 #Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 #Python
无需压缩软件,用python帮你操作压缩包
Aug 17 #Python
用Python制作mini翻译器的实现示例
Aug 17 #Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
Aug 17 #Python
pandas apply多线程实现代码
Aug 17 #Python
You might like
php下获取客户端ip地址的函数
2010/03/15 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
php高清晰度无损图片压缩功能的实现代码
2018/12/09 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
原生JS实现的自动轮播图功能详解
2018/12/28 Javascript
Python求解平方根的方法
2015/03/11 Python
Python实现查找匹配项作处理后再替换回去的方法
2017/06/10 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
python不相等的两个字符串的 if 条件判断为True详解
2020/03/12 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
python在地图上画比例的实例详解
2020/11/13 Python
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
程序员跳槽必看面试题总结
2013/06/28 面试题
就业自荐信
2013/12/04 职场文书
10的分与合教学反思
2014/04/30 职场文书
小学清明节活动总结
2014/07/04 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
委托公证书样本
2015/01/23 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
交通事故责任认定书
2015/08/06 职场文书
python爬虫之利用selenium模块自动登录CSDN
2021/04/22 Python
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP