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