引言

一直都是使用print打印输出信息来调试python代码,有个缺点就是代码完成之后需要将以前的print都删除或者注释掉, 这样既不美观,也不方便.本文主要介绍了如何使用python自带的logging库创建log实例来代替print函数进行debug, 以及创建代码片段供vim方便调用.

设置logging

首先需要在你的python代码里导入这个库

1
import logging

导入这个库之后,首先需要新建一个log实例

1
logger = logging.getLogger('log')

创建了实例之后可以设置log的级别(后面也可以更改级别),可以设置的级别如下:

级别 如何使用
DEBUG 详细信息,典型地调试问题时会感兴趣.
INFO 证明事情按预期工作.
WARNING 表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了’).软件还是在正常工作.
ERROR 由于更严重的问题,软件已不能执行一些功能了.
CRITICAL 严重错误,表明软件已不能继续运行了.

因为我们要调试,这里暂且就设置为DEBUG级别.

1
logger.setLevel(logging.DEBUG) 

设置完log级别之后,我们创建一个handler(处理器).

1
handler = logging.StreamHandler()

处理器还可以设置格式化器用于日志输出格式.

1
2
3
4
5
# 创建log格式化器,这里有设置了两种,后一种最简单只有输出信息
# formatter = logging.Formatter('[%(asctime)s] %(name)s:%(levelname)s:\n%(message)s')
formatter = logging.Formatter('%(message)s') 
# 设置格式化器
handler.setFormatter(formatter)

最后为logger添加handler.

1
logger.addHandler(handler)

完整代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 创建logger实例
logger = logging.getLogger('log')
# 设置log级别
logger.setLevel(logging.DEBUG)
# 创建handler(处理器)
handler = logging.StreamHandler()
# 创建log格式化器,这里有设置了两种,后一种最简单只有输出信息
# formatter = logging.Formatter('[%(asctime)s] %(name)s:%(levelname)s:\n%(message)s')
formatter = logging.Formatter('%(message)s')
# 设置格式化器
handler.setFormatter(formatter)
# 为Logger实例增加一个处理器
logger.addHandler(handler)

使用logging

例子:

1
2
3
4
5
6
a = 30
b = 10
c = a - b
logger.debug(c)
logger.warning(c)
logger.info(c)

如果不想显示debug的信息,只要改变之前设置的日志级别为更低的级别即可.

为vim添加代码片段,更加便捷的使用logging

在此之前需要安装UltiSnips与vim-snippets插件,然后找到UltiSnips文件夹中的python.snippets,再其中加入:

1
2
3
4
5
6
7
8
9
snippet log "using logging to replace print" b
logger = logging.getLogger('log')
logger.setLevel(logging.${1:DEBUG})
handler = logging.StreamHandler()
formatter = logging.Formatter('[%(asctime)s] %(name)s:%(levelname)s:\n%(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
$0
endsnippet

这样在用vim编辑python文件的时候输入log然后启动代码片段触发快捷键(我这里为就可以直接插入上面的代码.

参考

python logging模块使用教程

替换你的print(logging模块超简明指南)