logging模块---日志文件
1、logging模块简介及快速使用
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文 件回滚等;
(1)优点
1. 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
2. 尤其是代码运行在服务器上,当出现问题时可以通过查看日志进行分析
(2)logging快速使用
打印日志到标准输出中,默认的日志级别
#1、导入Logging包 import logging #2、设置配置信息 logging.basicConfig(level=logging.INFO,format='%(asctime)s-%(name)s-%(levelname)s-% (message)s') #3、定义日志名称getlogger logger = logging.getLogger("log_demo") #4、info,debug logger.info("info") logger.debug("debug") logger.warning("warning")
2、logging模块基本使用
#设置logger名称 logger = logging.getLogger(log_name) #设置log级别 logger.setLevel(logging.info) #创建一个handler,用于写入日志文件 fh = logging.FileHandler(log_file) 设置日志级别,默认为logging.WARNING fh.setLevel(logLevel[log_level]) 定义handler的输出格式 formatter = logging.Formatter('%(asctime)s %(name)s [line:%(lineno)d] %(levelname)s % (message)s') fh.setFormatter(formatter) 添加handler logger.addHandler(fh)
备注:
format
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
代码
import logging #输出控制台 #1、设置logger名称 logger = logging.getLogger("log_file_demo") #2、设置log级别 logger.setLevel(logging.INFO) #3、创建handler fh_stream = logging.StreamHandler() #写入文件 fh_file = logging.FileHandler("./test.log") #4、设置日志级别 fh_stream.setLevel(logging.DEBUG) fh_file.setLevel(logging.WARNING) #5、定义输出格式 formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s ') fh_stream.setFormatter(formatter) fh_file.setFormatter(formatter) #6、添加handler logger.addHandler(fh_stream) logger.addHandler(fh_file) #7、运行输出 logger.info("this is a info") logger.debug("this is a debug") logger.warning("this is a warning")
3、将日志进行封装
import logging from config import Conf import datetime,os from config.Conf import ConfigYaml #定义日志级别的映射 log_l = { "info": logging.INFO, "debug": logging.DEBUG, "warning": logging.WARNING, "error": logging.ERROR } #1、创建类 class Logger: #2、定义参数 #输出文件名称,Loggername,日志级别 def __init__(self,log_file,log_name,log_level): self.log_file = log_file #扩展名 配置文件 self.log_name = log_name #参数 self.log_level = log_level # 配置文件 #3、编写输出控制台或文件 # 设置logger名称 self.logger = logging.getLogger(self.log_name) # 设置log级别 self.logger.setLevel(log_l[self.log_level]) #logging.INFO #判断handlers是否存在 if not self.logger.handlers: # 输出控制台 fh_stream = logging.StreamHandler() fh_stream.setLevel(log_l[self.log_level]) formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s ') fh_stream.setFormatter(formatter) # 写入文件 fh_file = logging.FileHandler(self.log_file) fh_file.setLevel(log_l[self.log_level]) fh_file.setFormatter(formatter) # 添加handler self.logger.addHandler(fh_stream) self.logger.addHandler(fh_file) #1、初始化参数数据 #日志文件名称,日志文件级别 #日志文件名称 = logs目录 + 当前时间+扩展名 #log目录 log_path = Conf.get_log_path() #当前时间 current_time = datetime.datetime.now().strftime("%Y-%m-%d") #扩展名 log_extension = ConfigYaml().get_conf_log_extension() logfile = os.path.join(log_path,current_time+log_extension) #print(logfile) #日志文件级别 loglevel = ConfigYaml().get_conf_log() #print(loglevel) #2、对外方法,初始log工具类,提供其它类使用 def my_log(log_name = __file__): return Logger(log_file=logfile,log_name=log_name,log_level=loglevel).logger
if __name__ == "__main__": my_log().debug("this is a debug")