Python日志重复打印问题
用Python的logging模块记录日志时,出现了重复输出日志的问题。这里我是把logger封装了一层:
def init_logger(log_name, file_log_level=logging.DEBUG, stream_log_level=logging.INFO,
max_bytes=200 * 1024 * 1024, backup_count=10):
log_dir_path = os.path.join(CONST.PROJECT_DIR, 'logs')
if not os.path.isdir(log_dir_path):
os.makedirs(log_dir_path)
log_file_path = os.path.join(log_dir_path, '{}.log'.format(log_name))
logger = logging.getLogger(log_name)
fmt = '[%(name)s]' + '-[%(filename)s:%(lineno)s]' + \
'-[%(asctime)s]' + '-[%(levelname)s]' + '-[%(process)d]' + '-[%(thread)d]' + '\t%(message)s'
formatter = logging.Formatter(fmt)
file_handler = handlers.RotatingFileHandler(log_file_path, maxBytes=max_bytes,
backupCount=backup_count, encoding='utf-8')
file_handler.setLevel(file_log_level)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
stream_handler = logging.StreamHandler()
stream_handler.setLevel(stream_log_level)
stream_handler.setFormatter(formatter)
# logger.addHandler(stream_handler)
log_queue = Queue()
queue_handler = handlers.QueueHandler(log_queue)
# queue_handler.setLevel(stream_log_level)
# queue_handler.setFormatter(formatter)
queue_listener = handlers.QueueListener(log_queue, stream_handler)
logger.addHandler(queue_handler)
queue_listener.start()
logger.setLevel(file_log_level)
logger.propagate = False
return logger
logger = init_logger(PROJECT_NAME)
其他地方要用到logger直接导入。
logging日志输出重复一般都是因为多次addHandler的问题,代码里调用addHandler的地方只有init_logger,那么肯定是init_logger函数重复调用了,在init_logger后面输出调用栈:
logger = init_logger(PROJECT_NAME)
traceback.print_stack()
从调用栈中看到有两处import了logger这个模块,回溯到上一层调用发现有一处:
from src.common.logger import logger
另一处:
from common.logger import logger
统一成from common.logger import logger,问题解决。