ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python中logging库使用记录

2022-06-13 01:01:41  阅读:140  来源: 互联网

标签:输出 logging log 记录 python self 日志 my


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.

标签:输出,logging,log,记录,python,self,日志,my
来源: https://www.cnblogs.com/youreyebows/p/16358754.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有