原因:handler创建后没有移除,再次写日志时又重新创建了一个新的handler,原handler仍在运行,即写几次日志,就会循环几遍日志输出
解决方案:
1)创建使用后移除
调用removeHandler方法
调用handlers.pop() ,默认删除最后一个handler
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
import logging
import os.path
import time
from logging import handlers
class Logger(object):
def __init__(self):
# 在该路径下新建下级目录
new_name='/root/test/logs/'
#判断该目录是否存在
if not os.path.exists(new_name):
os.makedirs(new_name)
print(new_name + "目录创建成功")
try:
# 创建一个logger(初始化logger)
self.log = logging.getLogger()
self.log.setLevel(logging.DEBUG)
# 定义日志文件的路径以及名称
log_name = new_name + '/' + 'test.log'
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - '
'%(message)s')
# FileHandler 日志输出到文件
fh = logging.FileHandler(log_name)
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
self.log.addHandler(fh)
self.log.removeHandler(fh)
except Exception as e:
print("输出日志失败! %s" % e)
# 日志接口,用户只需调用这里的接口即可,这里只定位了INFO, WARNING, ERROR三个级别的日志,可根据需要定义更多接口
def info(cls,msg):
cls.log.info(msg)
return
def warning(cls,msg):
cls.log.warning(msg)
return
def error(cls, msg):
cls.log.error(msg)
return
2)创建handler前判断是否存在handler
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
import logging
import os.path
import time
from logging import handlers
class Logger(object):
def __init__(self):
# 在该路径下新建下级目录
new_name='/root/test/logs/'
#判断该目录是否存在
if not os.path.exists(new_name):
os.makedirs(new_name)
print(new_name + "目录创建成功")
try:
# 创建一个logger(初始化logger)
self.log = logging.getLogger()
self.log.setLevel(logging.DEBUG)
# 定义日志文件的路径以及名称
log_name = new_name + '/' + 'test.log'
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - '
'%(message)s')
# 判断条件,如果存在handlers则不创建,解决日志重复输出问题
if not self.log.handlers:
# StreamHandler 日志输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
# TimedRotatingFileHandler 日志拆分
# rh = handlers.TimedRotatingFileHandler(log_name, when='midnight', interval=1, backupCount=5)
rh = handlers.TimedRotatingFileHandler(log_name, when='M', interval=5, backupCount=5)
rh.setLevel(logging.DEBUG)
# TimedRotatingFileHandler对象自定义日志级别
# rh.suffix = "%Y%m%d.log"
rh.suffix = "%Y%m%d%H%M.log"
rh.setFormatter(formatter)
self.log.addHandler(ch)
self.log.addHandler(rh)
except Exception as e:
print("输出日志失败! %s" % e)
# 日志接口,用户只需调用这里的接口即可,这里只定位了INFO, WARNING, ERROR三个级别的日志,可根据需要定义更多接口
def info(cls,msg):
cls.log.info(msg)
return
def warning(cls,msg):
cls.log.warning(msg)
return
def error(cls, msg):
cls.log.error(msg)
return