logging模块,顾名思义就是针对日志的。到目前为止,所有的程序标准输出(输出到屏幕)都是使用的print函数。logging模块可以替代print函数的功能,并能将标准输出输入到日志文件保存起来,而且利用logging模块可以部分替代debug的功能,给程序排错。
1、简述logging模块
首先要说到的是logging模块的几个级别。默认情况下logging模块有6个级别。它们分别是NOTSET值为0、DEBUG值为10、INFO值为20、WARNING值为30、ERROR值为40、CRITICAL值为50(也可以自定义级别)。这些级别的用处是,先将自己的日志定一个级别,logging模块发出的信息级别高于定义的级别,将在标准输出(屏幕)显示出来。发出的信息级别低于定义的级别则略过。如果未定义级别,默认定义的级别是WARNING。
先测试一下。在Windows中打开IDLE,执行命令:
import logging
logging.NOTSET
logging.DEBUG
logging.INFO
logging.WARNING
logging.ERROR
logging.CRITICAL
logging.debug("debug message")
logging.info("info message")
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")
执行结果如图1所示。
图1 logging级别
使用logging最简单的方法就是logging.basicConfig。logging.basicConfig的应用方法为:
这个函数可用的参数有:
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger的日志级别。
参数中的format参数可能用到的格式化串:
%(name)s:logger的名字。
%(levelno)s:数字形式的日志级别。
%(levelname)s:文本形式的日志级别。
%(pathname)s:调用日志输出函数的模块的完整路径名,可能没有。
%(filename)s:调用日志输出函数的模块的文件名。
%(module)s:调用日志输出函数的模块名。
%(lineno)d:调用日志输出函数的语句所在的代码行。
%(created)f:当前时间,用UNIX标准的表示时间的浮点数表示。
%(relativeCreated)d:输出日志信息时,自logger创建以来的毫秒数。
参数中的datefmt是日期的格式化,最常用的几个格式化是:
%Y:年份的长格式,如2019。
%y:年份的短格式,如99。
%m:月份,01~12。
%d:日期,01~31。
下面利用logging.basicConfig写一个最基本的日志模块应用程序,编写testLogging.py,打开Putty连接到Linux,执行命令:
1 #!/usr/bin/env python3
2 #-*- coding: utf-8 -*-
3 __author__ = 'hstking hst_king@hotmail.com'
4
5 import logging
6
7 class TestLogging(object):
8 def __init__(self):
9 logFormat='%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s'
10 logFileName = './testLog.txt'
11
12 logging.basicConfig(level = logging.INFO,
13 format = logFormat,
14 filename = logFileName,
15 filemode = 'w')
16
17 logging.debug('debug message')
18 logging.info('info message')
19 logging.warning('warning message')
20 logging.error('error message')
21 logging.critical('critical message')
22
23
24 if __name__ == '__main__':
按Esc键,进入命令模式后输入:wq,保存testLogging.py。testlogging.py用于测试logging模块。该脚本使用不同的级别向logger发送了几条信息。执行命令:
图2 运行testLogging.py
使用logging模块很方便,但在编写过程中添加一大堆的代码就不是那么愉快的事情了。好在Python有强大的import,完全可以先配置好一个myLog.py,以后需要使用时直接导入程序中即可。
1 #!/usr/bin/env python3
2 # -*- coding:utf-8 -*-
3 __author__ = 'hstking hst_king@hotmail.com'
4
5 import logging
6 import getpass
7 import sys
8
9
10 # 定义MyLog类
11 class MyLog(object):
12 '''这个类用于创建一个自用的log '''
13 def __init__(self): #类MyLog的构造函数
14 user = getpass.getuser()
15 self.logger = logging.getLogger(user)
16 self.logger.setLevel(logging.DEBUG)
17 logFile = './' + sys.argv[0][0:-3] + '.log' #日志文件名
18 formatter = logging.Formatter('%(asctime)-12s %(levelname)-8s%(name)-10s %(message)-12s')
19
20 '''日志显示到屏幕上并输出到日志文件内'''
21 logHand = logging.FileHandler(logFile)
22 logHand.setFormatter(formatter)
23 logHand.setLevel(logging.ERROR) #只有错误才会被记录到logfile中
24
25 logHandSt = logging.StreamHandler()
26 logHandSt.setFormatter(formatter)
27
28 self.logger.addHandler(logHand)
29 self.logger.addHandler(logHandSt)
30
31 ''' 日志的5个级别对应以下的5个函数 '''
32 def debug(self,msg):
33 self.logger.debug(msg)
34
35 def info(self,msg):
36 self.logger.info(msg)
37
38 def warn(self,msg):
39 self.logger.warn(msg)
40
41 def error(self,msg):
42 self.logger.error(msg)
43
44 def critical(self,msg):
45 self.logger.critical(msg)
46
47 if __name__ == '__main__':
48 mylog = MyLog()
49 mylog.debug("I'm debug")
50 mylog.info("I'm info")
51 mylog.warn("I'm warn")
52 mylog.error("I'm error")
53 mylog.critical("I'm critical")
按Esc键,进入命令模式后输入:wq,保存myLog.py。myLog.py可以当成一个脚本执行,也可以当成一个模块导入其他的脚本中执行。在这里是作为脚本使用的,它的作用是将所有的log信息显示到屏幕上、错误信息存入log文档中。执行命令:
图3 运行myLog.py
下面再写一个testMyLog.py,在程序中导入图3中的myLog.py作为模块使用。编写testMyLog.py,打开Putty连接到Linux,执行命令:
1 #!/usr/bin/env python3
2 #-*- coding: utf-8 -*-
3 __author__ = 'hst_king hst_king@hotmail.com'
4
5 from myLog import MyLog
6
7 if __name__ == '__main__':
8 ml = MyLog()
9 ml.debug('I am debug message')
10 ml.info('I am info message')
11 ml.warn('I am warn message')
12 ml.error('I am error message')
13 ml.critical('I am critical message')
按Esc键,进入命令模式后输入:wq,保存testMyLog.py。testMyLog.py调用了myLog.py,将它作为模块使用。执行命令:
图4 导入自定义模块
python培训:http://www.baizhiedu.com/python2019