1、基本使用
1 import logging
2
3 logging.info("info")
4 logging.warning("warning")
5 logging.error('error')
上述代码仅会在控制台输出:
WARNING:root:warning
ERROR:root:error
因为默认仅输出WARNING及以上级别的日志。常用的级别由高到低有:CRITICAL、ERROR、WARNING、INFO、DEBUG;
输出的格式默认为:
%(levelname)s:%(name)s:%(message)s
-levelname:级别名称;
-name:日志收集器的名称,默认为root;
-message:日志内容;
要想输出其他等级的日志,需要改变输出级别,如下介绍两种方法;
2、改变输出的级别
2.1 使用basicConfig()方法
如果logger没有指定处理器,则会默认使用basicConfig,在里面可以对日志进行一些设置。该方法传关键字参数,看下常用的参数:
- filename:文件名;新建一个文件处理器FileHandler。并且把日志输出到该文件,此时日志不再在控制台输出;
- filemode:打开文件的方式;如果指定了filename,则可以指定该参数;默认a,表示追加;w,表示覆盖;
- format:指定日志输出的字符串格式;例如:format='%(levelname)s-%(name)s-%(asctime)s: %(message)s'
- datefmt:指定输出的时间格式;例如:datefmt='%Y-%m-%d'
- level:指定最低输出日志的等级;例如:level='INFO' 则INFO及以上级别的日志均能被输出
- stream:用例初始化一个StreamHandler;如果filename存在,则程序忽略stream;
- encoding:指定filname时,可以通过该参数设置编码;
使用示例:
1 logging.basicConfig(filename='logout.txt',
2 filemode='a',
3 format='%(levelname)s-%(name)s-%(asctime)s: %(message)s',
4 level='INFO',
5 datefmt='%Y-%m-%d')
6 # 在logout.txt文件输出结果:
7 # INFO-root-2022-06-09: info
8 # WARNING-root-2022-06-09: warning
9 # ERROR-root-2022-06-09: error
View Code
2.2 创建日志收集器和设置输出渠道
(一)创建日志收集器
logging.getLogger('py') py即收集器的名称,会在文件/控制台输出;如果不传名称,则默认使用RootLogger;
(二)设置输出渠道
- FileHandler:文件输出;
- 需要指定filename;模式默认是a(追加),模式同open函数;
- setLevel指定输出的等级;
- StreamHandler:控制台输出;
- setLevel指定输出的等级;
1 #1、创建日志收集器
2 my_log = logging.getLogger('py')
3 my_log.setLevel('DEBUG') #设置采集等级
4 #2、 设置输出渠道
5 # 2-1 可以同时设置两个输出渠道
6 sh = logging.StreamHandler() #2-1-1控制台输出,设置输出等级
7 sh.setLevel('DEBUG')
8 fh = logging.FileHandler("logout.txt") #2-1-2文件输入
9 fh.setLevel('DEBUG')
10 # 2-2 设置日志字符串格式
11 format = logging.Formatter("%(levelname)s-%(name)s-%(asctime)s: %(message)s")
12 # 2-2-1 两种输出渠道都设置format格式
13 sh.setFormatter(format)
14 fh.setFormatter(format)
15 # 2-3 给日志收集器设置输出渠道
16 my_log.addHandler(sh)
17 my_log.addHandler(fh)
18
19 #使用日志收集器采集日志
20 my_log.debug('debug')
21 my_log.info('info')
22 my_log.warning('warning')
23 my_log.error('error')
View Code
3、封装成类
最后,把logger封装成一个类方便调用:
1 import logging
2
3
4 class MyLog():
5
6 def __init__(self,filepath=None):#测试用例中setup中初始化一个实例
7 #1、创建日志收集器
8 self.my_log = logging.getLogger('py')
9 self.my_log.setLevel('DEBUG') #设置采集等级
10 #2、 设置输出渠道
11 # 2-1 可以同时设置两个输出渠道
12 self.sh = logging.StreamHandler() #2-1-1控制台输出,设置输出等级
13 self.sh.setLevel('DEBUG')
14 self.fh = logging.FileHandler("logout.txt") #2-1-2文件输入
15 self.fh.setLevel('DEBUG')
16 # 2-2 设置日志字符串格式
17 format = logging.Formatter("%(levelname)s-%(name)s-%(asctime)s: %(message)s")
18 # 2-2-1 两种输出渠道都设置format格式
19 self.sh.setFormatter(format)
20 self.fh.setFormatter(format)
21 # 2-3 给日志收集器设置输出渠道
22 self.my_log.addHandler(self.sh)
23 self.my_log.addHandler(self.fh)
24
25 # self.sh.close() #把输出渠道写在构造函数里暂时没找到合适的位置关闭处理器
26 # self.fh.close() #把输出渠道写在构造函数里暂时没找到合适的位置关闭处理器
27
28 def info(self,msg):
29 self.my_log.info(msg)
30
31 def warning(self,msg):
32 self.my_log.warning(msg)
33
34 def error(self,msg):
35 self.my_log.error(msg)
36
37 def close(self): #测试用例中teardown中调用,否则会出现重复日志
38 self.sh.close()
39 self.fh.close()
40 self.my_log.removeHandler(self.sh)
41 self.my_log.removeHandler(self.fh)
42
43 # 使用
44 log = MyLog()
45 log.info('info')
46 log.warning('warning')
47 log.error('error')
View Code
注意:一定要removehandler,否则会产生重复日志!(因为每次实例化都会去添加一个handler)
End.