Log类——基于logging库的封装

此模块为基于logging库的二次封装

 1 import logging
 2 import time
 3 import os
  #保存路径
4 file_path = r'\logs' 5 """#logger为记录器 Handler为处理器 Fromtter为格式器""" 6 class Log: 7 def __init__(self): 8 """#配置文件路径""" 9 self.file_path = os.path.join(file_path, time.strftime("%Y.%m.%d-%H-%M")+'.log') 10 "#实例化logger类" 11 self.logger = logging.getLogger() 12 "#设置logger的日志级别" 13 self.logger.setLevel(logging.INFO) 14 "#设置日志格式" 15 self.fromatter = logging.Formatter('[%(asctime)s-%(levelname)s:%(message)s') 16 17 def __console(self, level, message): 18 """#实例化处理器,配置文件保存路径,设置文件读写模式,设置文件名称""" 19 file_handler = logging.FileHandler(self.file_path, 'a', encoding='utf-8') 20 "#将日志级别设置为debug" 21 file_handler.setLevel(logging.INFO) 22 "#设置处理器的日志格式" 23 file_handler.setFormatter(self.fromatter) 24 "#将处理器加入到记录器中" 25 self.logger.addHandler(file_handler) 26 if level == "info": 27 self.logger.info(message) 28 "#每次打印后移除handler,否则会重复加入handler导致重复打印" 29 self.logger.removeHandler(file_handler) 30 elif level == 'debug': 31 self.logger.debug(message) 32 self.logger.removeHandler(file_handler) 33 elif level == 'warning': 34 self.logger.warning(message) 35 self.logger.removeHandler(file_handler) 36 elif level == 'error': 37 self.logger.error(message) 38 self.logger.removeHandler(file_handler) 39 40 def debug(self, message): 41 self.__console('debug', message) 42 43 def info(self, message): 44 self.__console('info', message) 45 46 def warning(self, message): 47 self.__console('warning', message) 48 49 def error(self, message): 50 self.__console('error', message)

 

关于logging模块的一些笔记

logging库:日志默认级别为waring
 
basicConfig(*args):日志配置函数
logging.basicConfig(filename=file, encoding='utf-8', level=logging.DEBUG)
filename:日志文件存放路径和名称
encoding:编码格式
level:日志等级
filemode:读写模式
format:显示日期和时间,format='%(asctime)s %(message)s',asctime获取时间,message获取打印消息
datefmt:打印时间格式,如:%Y%m%d %I:%M:%S %p时分秒需要使用分号,%p为时间段
datefmt 参数的格式与 time.strftime() 支持的格式相同
 
日志库采用模块化方法,并提供几类组件:记录器、处理器、过滤器和格式器。
  • 记录器暴露了应用程序代码直接使用的接口。
  • 处理器将日志记录(由记录器创建)发送到适当的目标。
  • 过滤器提供了更精细的附加功能,用于确定要输出的日志记录。
  • 格式器指定最终输出中日志记录的样式。
 
记录器:Logger类
logger = logging.getLogger()
logger.setLevel()设置日志等级
logger.addHandler()和logger.removeHandler()将记录器添加和删除处理器对象
logger.addFilter()和logger.removeFilter()可以添加或移除记录器对象中的过滤器
Logger.debug() 、 Logger.info() 、 Logger.warning() 、 Logger.error() 和 Logger.critical() 都创建日志记录,包含消息和与其各自方法名称对应的级别。该消息实际上是一个格式化字符串,它可能包含标题字符串替换语法 %s 、 %d 、 %f 等等。其余参数是与消息中的替换字段对应的对象列表。关于 **kwargs ,日志记录方法只关注 exc_info 的关键字,并用它来确定是否记录异常信息。
处理器:Handler类
Handler对象负责将适当的日志消息(基于日志消息的严重性)分派给处理器的指定目标。 Logger 对象可以使用 addHandler() 方法向自己添加零个或多个处理器对象。
setLevel() 方法,就像在记录器对象中一样,指定将被分派到适当目标的最低严重性。为什么有两个 setLevel() 方法?记录器中设置的级别确定将传递给其处理器的消息的严重性。每个处理器中设置的级别确定该处理器将发送哪些消息。
setFormatter() 选择一个该处理器使用的 Formatter 对象。
addFilter() 和 removeFilter() 分别在处理器上配置和取消配置过滤器对象。
应用程序代码不应直接实例化并使用 Handler 的实例。 相反, Handler 类是一个基类,它定义了所有处理器应该具有的接口,并建立了子类可以使用(或覆盖)的一些默认行为。
格式器:Formatter类
logging.Formatter.__init__(fmt=None, datefmt=None, style='%')
如果没有消息格式字符串,则默认使用原始消息。如果没有日期格式字符串,则默认日期格式为:%Y-%m-%d %H:%M:%S
最后加上毫秒数。 style 是 %,'{ ' 或 '$' 之一。 如果未指定,则将使用 '%'。
 
 
logging记录器,处理器,格式器的使用流程
首先,记录器实例化 log = logging.getLogger()
实例化后,设置日志级别,log.setLevel(级别定义)
设置记录器日志级别后,格式器实例化,fm = logging.Formatter(格式定义)
处理器实例化,fh = logging.Filehandler(文件保存路径,文件名称)
处理器实例化后,设置日志级别fh.setLevel()
设置级别后设置格式化,fh.setFormatter(fm)将格式器实例化加入到处理器中
将实例化后的处理器加入到记录器中,logger.addHandler(fh)

每次打印后移除handler,否则会重复加入handler导致重复打印logger.removeHandler(fh)
posted @ 2021-11-09 16:29  水玄雨林  阅读(168)  评论(0)    收藏  举报