Python记录重复行

时间:2014-12-02 15:33:11

标签: python logging

我的问题是设计问题。我有以下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的名称将返回“相同”的日志记录类实例

1 个答案:

答案 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')

相同的记录器可以获得更多处理程序。