我们在写程序的时候经常会打一些日志来帮助我们查找问题,这次学习一下logging模块,在python里面如何操作日志。
介绍一下logging模块,logging模块就是python里面用来操作日志的模块,logging模块中主要有4个类,分别负责不同的工作:
Logger 记录器,暴露了应用程序代码能直接使用的接口;简单点说就是一个创建一个办公室,让人在里头工作
Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地;这个简单点说就是办事的人,你可以指定是让在控制输出日志,还是在文件里面打印日志,常用的有4种:
StreamHandler 控制台输出
FileHandler 文件输出
下面两种需要导入
handlers
from logging import handlers
TimedRotatingFileHandler 按照时间自动分割日志文件
RotatingFileHandler 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件
Filter
过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。(不常用)
Formatter
格式化器,指明了最终输出中日志记录的布局。指定输出日志的格式
'''
Python–logging模块
# logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
# logging.info('info级别,正常输出信息,一般用来打印一些正常的操作')
# logging.warning('waring级别,一般用来打印警信息')
# logging.error('error级别,一般用来打印一些错误信息')
# logging.critical('critical级别,一般用来打印一些致命的错误信息')
日志级别:debug<info<warning<error<critical
日志打印的时候,只能打印level定义的级别以上的级别信息
'''
import logging
from logging import handlers
#只在控制台打印日志
logging.basicConfig(level=logging.ERROR,#控制台打印的日志级别
format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
#日志格式,日志时间,日志路径,日志行数,日志级别,日志信息
)
logging.debug('我是debug')
logging.info('我是info')
logging.warning('我是warning')
logging.error('我是error')
logging.critical('我是critical')
上面的只是在控制台打印日志,并没有把日志写在文件里面,一般我们都会把日志写在日志文件里面,也很简单,只需要加个参数指定文件名就行了。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
logging.basicConfig(level=logging.ERROR,#控制台打印的日志级别
filename='log.txt',#文件名
filemode='a',#模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
#a是追加模式,默认如果不写的话,就是追加模式
format=
'%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
#日志格式
)
logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
logging.info('info级别,正常输出信息,一般用来打印一些正常的操作')
logging.warning('waring级别,一般用来打印警信息')
logging.error('error级别,一般用来打印一些错误信息')
logging.critical('critical级别,一般用来打印一些致命的错误信息')
|
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,这个参数可以输出很多有用的信息,如下面的几种格式:
%(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: 打印日志信息
我在工作中给的常用格式在前面已经看到了。就是:
format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
这个格式可以输出日志的打印时间,是哪个文件第几行输出的,输出的日志级别是什么,以及输入的日志内容。
|
加上文件名之后就会发现控制台不会输出日志了,日志文件也产生了,那么如何既在控制台输出日志,也在文件中写入呢?
怎么实现呢,就得有个办公室,里面塞俩人,一个给负责往控制台输出日志,一个负责写文件,你把他俩往办公室一塞,他俩就能干活了。
'''
既在控制台输出日志,也在文件中写入日志
'''
import logging
from logging import handlers
Logger = logging.getLogger()# 创建一个logger对象
Logger.setLevel(logging.DEBUG)#设置日志级别
#一个往屏幕上输出日志 StreamHandler
#一个往文件里写日志 TimedRotatingFileHandler
fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
st = logging.StreamHandler() # 实例化StreamHandler
th = handlers.TimedRotatingFileHandler(
'my.log',when='S',encoding='utf-8',backupCount=5)
# 第一个参数是日志名称,第二个参数when是隔多久生成一个日志,backupCount是备份文件的个数,如果超过这个超过这个个数,就会自动删除
# when:# S 秒
# M 分
# H 小时、
# D 天、
# W 每星期(interval==0时代表星期一)
# midnight 每天凌晨
th.setFormatter(fmt)
Logger.addHandler(st)
Logger.addHandler(th)
Logger.debug('my log debug information')
Logger.info('my log info information')
Logger.warning('my log warning information')
Logger.error('my log error information')
Logger.critical('my log critical information')