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基本的问题")

浙公网安备 33010602011771号