Python logging模块

默认logging函数输出的warning级别的日志。

日志级别

日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET

logging库提供了多个组件:Logger、Handler、Filter、Formatter:

1
2
3
4
Logger 对象提供应用程序可直接使用的接口,供应用代码使用;
Handler 发送日志到适当的目的地,比如socket和文件等
Filter 提供了过滤日志信息的方法,控制输出;
Formatter 指定日志输出和显示的具体格式。

通过logging.basicConfig对日志的输出格式配置

cat test.log

需要注意的是
只有等级大于等于basicConfig定义的level的log才会被输出,比如这里定义的等级为DEBUG、debug、info、warning、error日志等级都大于等于debug

logging.basicConfig各参数
level:日志等级
format格式

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
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
filename:输出文件名
filemode:写入模式w为直接写入,a为追加
datafmt:输出的时间格式 这里用%Y-
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称

将日志同时输出到屏幕和文件

输出

logging 日志轮询

使用TimedRotatingFileHandler设置日志轮转,轮转的方式有两种一种是基于时间的轮转,一种是基于日志文件大小的轮转
TimedRotatingFileHandler函数参数说明

1
logging.handlers.TimedRotatingFileHandler(file_name,when=时间单位, interval='时间间隔',backupCount="保留的文件个数")

interval:表示等待多长时间文件重建,重建的文件名等于file_name+suffix

以下面例子说明

myadd.addHandler(filehandler)的意思是给myapp这个logger添加filehandler这个handler。

执行脚本可以看见每隔一秒会自动生成一个新的日志文件,到满3个时会自动进行一次新的轮转


TimedRotatingFileHandler设置的重建时间间隔后,suffix就需要按装下面的进行配置不然删除不了,比如设置的为S则suffix为%Y-%m-%d_%H-%M-%S

RotatingFileHandler安文件大小切分

logger实例的父子关系

通过前面几个例子对比你应该发现了前面我用logging.basicConfig()去设置format,后面我是通过getlogger创建一个logger后,通过setformat方法去给他对应的handler设置format。

root logger是处于最顶层的logger,同时也是默认的logger,如果不创建logger实例默认调用logger.info(),logger.debug(),logger.error()使用

如何得到root logger
通过logging.getLogger()和logging.getLogger(“”)得到root logger实例。

logger的父子关系
logger以name命名方式来表达父子关系
比如

logging.getLogger(foo)

logging.getLogger(foo.tar)

effective level

一个looger如果没有指定level,就继承父level,如果父logger也没有就直接继承root的level。
handler同样,子没有就继承父的,父也没有的话就继承root的

root logger这里没设置logger的setLevel默认是warning,但父logger设置了,所以父logger会将自己的logger setlevel传递给root logger

调用配置好的logging

正常写程序中只要配置好一个logging,其他程序只要调用他就可以了一种是通过logging.config,一种是通过模块导入

介绍方法二:
比如我将配置好的logging写在test.py里面

在另外一个程序中调用它

1
2
import test
test.myapp.info("test")

这样输出的就是按test.py里面myapp这个logger配置好的log了

1
2
3
4
5
http://blog.csdn.net/lizhe_dashuju/article/details/72579705
http://blog.csdn.net/z_johnny/article/details/50812878
http://kenby.iteye.com/blog/1162698
http://blog.csdn.net/chosen0ne/article/details/7319306