2014-12-02 43 views
2

我的问题是设计问题。我有以下Logger类:Python日志记录重复行

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类,需要写同一个记录器,我得到重复的线条,这再现了错误:

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 

等等,我知道记录器是一个Singleton类和错误必须是在我的记录器类,但我认为getLogger与记录器的名称将返回“相同”的日志类实例。

回答

4

你的假设是正确的,并且是问题的原因。 (在这两个电话等情况下)使用相同的name参数

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

同一记录器变得更处理程序。