Python–logging模块知多少

我们在写程序的时候经常会打一些日志来帮助我们查找问题,这次学习一下logging模块,在python里面如何操作日志。
介绍一下logging模块,logging模块就是python里面用来操作日志的模块,logging模块中主要有4个类,分别负责不同的工作:

Logger 记录器,暴露了应用程序代码能直接使用的接口;简单点说就是一个创建一个办公室,让人在里头工作 

Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地;这个简单点说就是办事的人,你可以指定是让在控制输出日志,还是在文件里面打印日志,常用的有4种: 

                StreamHandler 控制台输出 

                FileHandler 文件输出

                下面两种需要导入

                        handlers
                        from logging import handlers 

                        TimedRotatingFileHandler 按照时间自动分割日志文件 

                        RotatingFileHandler 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件 

                Filter
过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。(不常用) 

                Formatter
格式化器,指明了最终输出中日志记录的布局。指定输出日志的格式

 
1
2
3
4
5
6
7
8
9
10
11
12
13
logging
handlers
#只在控制台打印日志
#控制台打印的日志级别
=
'%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
#日志格式
)
)
)
)
)
)

日志级别 debug < info < warning < error < critical
设置了日志级别之后,会打印该级别以及比该级别高的所有日志,举个例子,如果日志级别是warning,那么就会打印warning、error、critical,这三个级别的日志,不会打印debug和info级别的,如果是debug,最低级别的日志,那么所有的日志都会打印。
上面的只是在控制台打印日志,并没有把日志写在文件里面,一般我们都会把日志写在日志文件里面,也很简单,只需要加个参数指定文件名就行了。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
#控制台打印的日志级别
#文件名
#模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
#a是追加模式,默认如果不写的话,就是追加模式
=
'%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
#日志格式
)
)
)
)
)
)
 
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
format,这个参数可以输出很多有用的信息,如下面的几种格式:
打印日志级别的数值
 
 
打印日志级别名称
 
 
]
 
 
打印当前执行程序名
 
 
打印日志的当前函数
 
 
打印日志的当前行号
 
 
打印日志的时间
 
 
ID
 
 
打印线程名称
 
 
ID
 
 
打印日志信息
 
 
我在工作中给的常用格式在前面已经看到了。就是:
'%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
这个格式可以输出日志的打印时间,是哪个文件第几行输出的,输出的日志级别是什么,以及输入的日志内容。

加上文件名之后就会发现控制台不会输出日志了,日志文件也产生了,那么如何既在控制台输出日志,也在文件中写入呢?

怎么实现呢,就得有个办公室,里面塞俩人,一个给负责往控制台输出日志,一个负责写文件,你把他俩往办公室一塞,他俩就能干活了。

 
 
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
logging
handlers
)
#先创建一个logger对象,相当于这个办公室,也就是上面说的Logger
#设置日志的总级别
#创建一个文件处理器,也就是把日志写到文件里头
#设置文件输出的级别
#创建一个控制台输出的处理器,这两个就是上面说的Handler
)
#设置控制台输出的日志级别,这两个级别都可以单独设置,他们俩和logger的级别区别是如果logger设置的级别比里面的handler级别设置的高,那么就以logger的级别为准
)
#指定间隔时间自动生成文件的处理器
#interval是时间间隔,backupCount是备份文件的个数,如果超过这个超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:
# S 秒
# M 分
# H 小时、
# D 天、
# W 每星期(interval==0时代表星期一)
# midnight 每天凌晨
)
)
#指定日志格式,上面咱们写了常用的格式,直接指定了就行了,这也就是咱们上面说的Formatter
)
)
)
#设置两个处理器的日志格式
 
)
)
)
#把两个handler加入容器里头,相当于把工作人员培训完了,你们可以上班了
)
)
)
)
)

这样logger这个日志办公室已经搞好了,咱们就可以直接用了,运行完发现文件也产生了,控制台也有日志。如果不设置日志级别的话,默认级别是waring。
下面我们自己封装一个类来使用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
logging
handlers
:
{
,
,
,
,
CRITICAL
#日志级别关系映射
:
'''
 
        :param fp:日志文件路径
        :param level: 日志级别 默认是debug
        :param when: 分割日志的单位 S 秒、M 分、 H 小时、 D 天、 W 每星期(interval==0时代表星期一)、midnight 每天凌晨
        :param interval: 时间间隔 默认每天凌晨
        :param backCount: 备份文件个数 默认5个
        :param encoding: 日志文件编码
        '''
)
)
)
)
)
)
)
)
)
)
)
)
:
)
:
)
:
)
:
)
:
)
:
#实例化
#调用