我的问题是设计问题。我有以下Logger类:
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
上下文如下,我有几个模块将使用这个类,每个类都与其他类或记录器无关,所以每个类都实例化一个新的Logger类(即使他们需要写入同一个文件),问题是如果我有2个类需要写入同一个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:40,665 - 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是一个Singleton类,bug必须在我的Logger类中,但我假设getLogger
具有logger的名称将返回“相同”的日志记录类实例
答案 0 :(得分:4)
您的假设是正确的,并且是问题的原因。您在此处添加了许多处理程序相同的记录程序:
self.logger = logging.getLogger(name) # <-- same logger for same "name"!
self.logger.setLevel(logging.INFO)
self.logger.addHandler(loghandler)
每个实例化都使用相同的name
参数(在两种调用中都是这种情况):
# same name!
def a():
log = Logger(log_filename='test.log', name='test')
...
def b():
log = Logger(log_filename='test.log', name='test')
相同的记录器可以获得更多处理程序。