Python日志记录重复行
我的问题是设计问题。我拥有以下记录器类:Python日志记录重复行,python,logging,Python,Logging,我的问题是设计问题。我拥有以下记录器类: import logging, logging.handlers class Logger(object): def __init__(self, log_filename, name): self.LOG_FILENAME = log_filename logging.basicConfig(format='%(asctime)s %(message)s') formatter = loggi
import logging, logging.handlers
class Logger(object):
def __init__(self, log_filename, name):
self.LOG_FILENAME = log_filename
logging.basicConfig(format='%(asctime)s %(message)s')
formatter = logging.Formatter(
'%(asctime)s - %(levelname)s - %(message)s')
loghandler = logging.handlers.RotatingFileHandler(
self.LOG_FILENAME)
loghandler.setFormatter(formatter)
self.logger = logging.getLogger(name)
self.logger.setLevel(logging.INFO)
self.logger.addHandler(loghandler)
def getLogger(self):
return self.logger
上下文如下,我有几个模块将使用这个类,每个类都与其他类或记录器无关,因此每个类都实例化一个新的记录器类(即使它们需要写入同一个文件),问题是如果我有两个类需要写入同一个记录器,我会得到重复的行,这会复制错误:
def a():
log = Logger(log_filename='test.log', name='test')
logger = log.getLogger()
logger.info('A')
def b():
log = Logger(log_filename='test.log', name='test')
logger = log.getLogger()
logger.info('B')
因此,如果我调用a()
我将得到我所期望的:2014-12-02 10:26:40665-INFO-a
,但如果现在调用b()
,我将得到:
2014-12-02 10:26:40,665 - INFO - A
2014-12-02 10:26:48,553 - INFO - B
2014-12-02 10:26:48,553 - INFO - B
诸如此类,我知道Logger是一个单例类,错误必须在我的Logger类中,但我假设带有Logger名称的
getLogger
将返回“相同”的日志类实例。您的假设是正确的,是问题的原因。您正在将许多处理程序添加到同一个记录器中,如下所示:
self.logger = logging.getLogger(name) # <-- same logger for same "name"!
self.logger.setLevel(logging.INFO)
self.logger.addHandler(loghandler)
同一个记录器获得更多的处理程序
# same name!
def a():
log = Logger(log_filename='test.log', name='test')
...
def b():
log = Logger(log_filename='test.log', name='test')