1、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
2.具体代码如下:
import logging from logging import handlers import os class LoggerBasic(object): @classmethod def logger_basic(cls): logger = logging.getLogger(__name__) # 设置输出的等级 LEVELS = {'NOSET': logging.NOTSET, 'DEBUG': logging.DEBUG, 'INFO': logging.INFO, 'WARNING': logging.WARNING, 'ERROR': logging.ERROR, 'CRITICAL': logging.CRITICAL} # 创建文件目录 logs_dir = f"{os.path.dirname(os.path.dirname(__file__))}/log" file_name = 'ApiTestLogs' if os.path.exists(logs_dir) and os.path.isdir(logs_dir): pass else: os.mkdir(logs_dir) # 修改log保存位置 # timestamp = time.strftime("%Y-%m-%d", time.localtime()) logfilename = f'{file_name}.log' logfilepath = os.path.join(logs_dir, logfilename) # rotatingFileHandler = logging.handlers.RotatingFileHandler(filename=logfilepath, # maxBytes=1024 * 1024 * 50, # backupCount=5) rotatingFileHandler = logging.handlers.TimedRotatingFileHandler(filename=logfilepath, when='D', interval=30, encoding='utf-8') # 按照时间进行切割. # 设置输出格式 formatter = logging.Formatter('%(asctime)s -%(filename)s -%(levelname)s[line:%(lineno)d]: -%(message)s', '%Y-%m-%d %H:%M:%S %p') rotatingFileHandler.setFormatter(formatter) #加这一行if判断最为重要,如果不加的话,会重复打印日志 if not logger.handlers: # 控制台句柄 console = logging.StreamHandler() console.setLevel(logging.NOTSET) console.setFormatter(formatter) # 添加内容到日志句柄中 logger.addHandler(rotatingFileHandler) logger.addHandler(console) logger.setLevel(LEVELS['INFO']) return logger
解决日志重复打印来自于:https://www.cnblogs.com/kisun168/p/11912131.html