最近一个在研项目需要做一个原型系统,为方便高效的保存处理过程,采用python的logging库实现日志功能。原型系统程序包含主函数文件和几个功能文件,每个文件中都实例化了自己封装好的日志类,但是出现了一个问题,每条日志会重复打印好几次。查了相关的资料,说是日志实例具备继承关系。
解决办法就是在创建handler之前判断一下logger是否已经具备句柄了,若已存在,则不要再次创建。
import logging
# 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件
class Logger:
def __init__(self, logger_id=1, logFile='Logs/xxx.log'):
"""
指定保存日志的文件路径,日志级别,以及调用文件
将日志存入到指定的文件中
"""
# 创建一个logger
self.logger = logging.getLogger("xxx_" + str(logger_id))
self.logger.setLevel(logging.DEBUG)
# self.logger.propagate = False
# 先判断logger是否存在文件句柄,若不存在则进行创建,否则会出现日志重复打印的问题
if not self.logger.handlers:
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler(logFile)
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
# ch = logging.StreamHandler()
# ch.setLevel(logging.DEBUG)
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(funcName)s - %(message)s')
fh.setFormatter(formatter)
# ch.setFormatter(formatter)
# 给logger添加handler
self.logger.addHandler(fh)
# self.logger.addHandler(ch)
def getlog(self):
return self.logger