一、为什么使用logging模块
啄木鸟社区里的Pythonic八荣八耻有一条:
1 |
|
很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误、警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;
为什么不用print打印输出?
这种方式对于简单脚本型程序有用,但是如果是复杂的系统,最好不要用。首先,这些print是没用的输出,大量使用很有可能会被遗忘在代码里。再者,print 输出的所有信息都到了标准输出中,这将严重影响到你从标准输出中查看其它输出数据。
使用logging的优势:
1 2 3 4 |
|
下面让我们正式进入logging的世界:
二、logging日志框架
主要包括四部分:
1 2 3 4 |
|
1)loggers
1 2 3 |
|
2)Handlers
1 2 3 |
|
3)Filters
1 2 3 |
|
4) Formatters
Formatters 指定了最终某条记录打印的格式布局。Formatter会将传递来的信息拼接成一条具体的字符串,
默认情况下Format只会将信息%(message)s直接打印出来。Format中有一些自带的LogRecord属性可以使用,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
一个Handler只能拥有一个Formatter 因此如果要实现多种格式的输出只能用多个Handler来实现,更详细的在docs.python.org里找logging模块:
三、logging日志级别( 默认级别为warning,默认打印到终端)
“日志级别”提供了一种方式,按重要性对日志消息进行分类。5 个日志级别如表 1 所示,从最不重要到最重要。利用不同的日志函数,消息可以按某个级别记入日志。
表 1 Python logging日志级别
级别 | 对应的函数 | 描述 |
DEBUG | logging.debug() | 最低级别,用于小细节,通常只有在诊断问题时,才会关心这些消息。 |
INFO | logging.info() | 用于记录程序中一般事件的信息,或确认一切工作正常。 |
WARNING | logging.warning() | 用于表示可能的问题,它不会阻止程序的工作,但将来可能会。 |
ERROR | logging.error() | 用于记录错误,它导致程序做某事失败。 |
CRITICAL | logging.critical() | 最高级别,用于表示致命的错误,它导致或将要导致程序完全停止工作。 |
日志消息将会作为一个字符串,传递给这些函数。另外,日志级别只是一种建议,归根到底还是由程序员自己来决定日志消息属于哪一种类型。
可以给日志对象(Logger Instance)设置日志级别,低于该级别的日志消息将会被忽略,也可以给Hanlder设置日志级别,对于低于该级别的日志消息, Handler也会忽略。
四、logging禁用日志
在调试完程序后,可能并不希望所有这些日志消息出现在屏幕上,这时就可以使用 logging.disable() 函数禁用这些日志消息,从而不必进入到程序中,手工删除所有的日志调用。
logging.disable() 函数的用法是,向其传入一个日志级别,它会禁止该级别以及更低级别的所有日志消息。因此,如果想要禁用所有日志,只要在程序中添加 logging.disable(logging.CRITICAL) 即可,例如:
>>> import logging >>> logging.basicConfig(level=logging.INFO, format=' %(asctime)s - %(levelname)s - %(message)s') >>> logging.critical('Critical error! Critical error!') 2019-09-11 14:42:14,833 - CRITICAL - Critical error! Critical error! >>> logging.disable(logging.CRITICAL) >>> logging.critical('Critical error! Critical error!') >>> logging.error('Error! Error!')
因为 logging.disable() 将禁用它之后的所有消息,所以可以将其添加到程序中更接近 import logging 的位置,这样更容易找到它,方便根据需要注释掉它,或取消注释,从而启用或禁用日志消息。
五、将日志消息输出到文件中
虽然日志消息很有用,但它们可能塞满屏幕,让你很难读到程序的输出。考虑到这种情况,可以将日志信息写入到文件,既能使屏幕保持干净,又能保存信息,一举两得。
将日志消息输出到文件中的实现方法很简单,只需要设置 logging.basicConfig() 函数中的 filename 关键字参数即可,例如:
>>> import logging
>>> logging.basicConfig(filename='demo.txt', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
此程序中,将日志消息存储到了 demo.txt 文件中,该文件就位于运行的程序文件所在的目录。
六、日志字典
以上存在几个问题:
1 2 3 |
|
python2.7以后,可以从字典中加载logging配置,也就意味着可以通过JSON或者YAML文件加载日志的配置,好处是所有与logging模块有关的配置都写到字典中就可以了,更加清晰,方便管理
完整版示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
抄自于:
https://www.cnblogs.com/wf-linux/archive/2018/08/01/9400354.html
https://www.cnblogs.com/deeper/p/7404190.html
https://www.cnblogs.com/linhaifeng/articles/6384466.html#_label12