python中的logging模块

1.logging模块的四大组件

  logger:日志器,提供程序可使用的接口

  handler:处理器,用于写入日志文件并输出到指定位置,如文件、控制台或网络等

  filter:过滤器,用于输出符合指定条件的日志记录

  formatter:格式器,决定日志记录的输出格式

  

2.如何使用----基本用法

  1.创建logger对象,返回一个日志器

    logger = logging.getlogger()

  2.设置日志等级

    logger.setLevel("DEBUG") #设置日志等级为debug

  3.创建一个处理器对象

    fh = logging.FileHandler(filename="bbb.log", mode='a', encoding="utf-8", delay=False) #创建一个文件处理器,日志输入文件,需要指定文件名称,写入的模式,编码格式等

  4.创建一个格式器对象

    fmt = logging.Formatter("[%(asctime)s]-[%(levelname)s]-[%(pathname)s]-[Line:%(lineno)d]-[LoggerInfo:%(message)s]") #一般格式器中要定义好日志产生时间,日志级别,产生日志的模块全路径,模块的哪一行,具体的日志信息等

  5.为处理器添加格式

    fh.setFormatter(fmt=fmt),将第4步中生成的格式器给第3步生成的处理器“吞吃”

  6.为日志器添加处理方式

    logger.addHandler(fh),将第5出设置格式后的处理器对象给日志器“吞吃”

  7.调用日志器对象,生成日志

    logger.debug("这是一个debug错误")

  8.源码如下:

 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 import logging
 4 
 5 logger = logging.getLogger()
 6 logger.setLevel(logging.DEBUG)
 7 fh = logging.FileHandler(filename="kkk.log",mode='a',encoding="utf-8")
 8 fmt = logging.Formatter("[%(asctime)s]-[%(levelname)s]-[%(pathname)s]-[Line:%(lineno)d]-[LoggerInfo:%(message)s]")
 9 fh.setFormatter(fmt=fmt)
10 logger.addHandler(fh)
11 logger.debug("ajffasfdsas")

3.进一步的优化

上面的基本用法中,日志生成在了当前目录,且所有的日志都在一个文件中,时间长了,日志肯定会爆掉,所有可以将日志放置到指定的目录下面,以天为单位每天的日志放置到不同的日志文件

a.先生成日志的存放目录

1 import os
2 def make_log_dir(dirname='logs'):
3     now_dir = os.path.dirname(__file__) #获取当然文件所在路径
4     father_path = os.path.split(now_dir)[0] #获取当前文件所在目录
5     path = os.path.join(father_path,dirname) #拼接新路径
6     path = os.path.normpath(path) #规范化新路径
7     if not os.path.exists(path): #如果路径下没有指定的dirname,去创建这个路径下的dirname用于放置后面的日志文件
8         os.mkdir(path)
9     return path #返回存放日志文件的目录,便于后面生成日志

b.完整优化的代码

 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 import logging
 4 import os
 5 import time
 6 
 7 class Logging():
 8 
 9     def make_log_dir(self,dirname='logs'): #创建存放日志的目录,并返回目录的路径
10         now_dir = os.path.dirname(__file__)
11         father_path = os.path.split(now_dir)[0]
12         path = os.path.join(father_path,dirname)
13         path = os.path.normpath(path)
14         if not os.path.exists(path):
15             os.mkdir(path)
16         return path
17 
18     def get_log_filename(self):#创建日志文件的文件名格式,便于区分每天的日志
19         filename = "{}.log".format(time.strftime("%Y-%m-%d",time.localtime()))
20         filename = os.path.join(self.make_log_dir(),filename)
21         filename = os.path.normpath(filename)
22         return filename
23 
24     def log(self,log_level=logging.DEBUG):#生成日志的主方法
25         logger = logging.getLogger()
26         logger.setLevel(log_level)
27         fh = logging.FileHandler(filename=self.get_log_filename(),mode='a',encoding="utf-8")
28         fmt = logging.Formatter("[%(asctime)s]-[%(levelname)s]-[%(pathname)s]-[Line:%(lineno)d]-[LoggerInfo:%(message)s]")
29         fh.setFormatter(fmt=fmt)
30         logger.addHandler(fh)
31         return logger
32 
33 if __name__ == "__main__":
34     logger = Logging()
35     logger.log().debug("这是一个debug基本的问题")

 

posted @ 2020-09-03 08:00  奔腾的公牛  阅读(129)  评论(0)    收藏  举报