Python logger重复记录同一条日志
我有一个这样的日志初始化函数:
def generate_logger():
import logging
LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log")
FORMAT = "%(asctime)s : %(message)s"
logger = logging.getLogger()
logger.setLevel(logging.INFO)
fh = logging.FileHandler(LOG_FILENAME)
formatter = logging.Formatter(FORMAT)
fh.setFormatter(formatter)
logger.addHandler(fh)
return logger
在我代码的某个部分,我有这样的异常捕获:
logger = generate_logger()
except AttributeError:
logger.error('Opps we got an error')
奇怪的是,我得到的错误信息被写了两次,但只能捕获到一次。当我把 logger.error('哎呀,我们遇到一个错误')
换成 print "测试"
时,我只看到 "测试" 打印了一次。
这可能是什么问题,解决办法是什么呢?
5 个回答
3
我觉得你可能不小心给日志记录器加了两个处理程序。也许在某个时候,系统自动添加了一个处理程序。
13
我也遇到过同样的问题,后来找到了这个页面。没错,我当时也创建了多个处理器。在 generate_logger()
这个函数里,你可以检查一下是否有其他的处理器,如果有的话就把它们删除掉。
def generate_logger():
import logging
LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log")
FORMAT = "%(asctime)s : %(message)s"
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# Reset the logger.handlers if it already exists.
if logger.handlers:
logger.handlers = []
fh = logging.FileHandler(LOG_FILENAME)
formatter = logging.Formatter(FORMAT)
fh.setFormatter(formatter)
logger.addHandler(fh)
return logger
15
每次你调用那个函数时,都会给根日志记录器添加一个新的文件处理器:调用 logger.getLogger()
而不传名字参数时,每次返回的都是同一个日志记录器对象。
你应该只调用一次 generate_logger()
,然后通过调用 logger.getLogger()
来获取同一个日志记录器对象:
generate_logger()
# .... some time later
log = logger.getLogger()
except AttributeError:
log.error('Opps we got an error')
(注意,现在你不需要 generate_logger()
返回任何值)