python中logging库使用记录

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:文件输出;
  1. 需要指定filename;模式默认是a(追加),模式同open函数;
  2. setLevel指定输出的等级;
  • StreamHandler:控制台输出;
  1. 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.

posted @ 2022-06-13 00:47  youreyebows  阅读(55)  评论(0编辑  收藏  举报