0

我有一个 python 项目,其中有 3 个 python 文件,其中app.py主文件和其他两个文件是tracker.pycelerio.py. 我为所有文件启用了日志记录,下面是它的代码:

def setup_logger(logger_name, log_file, level=logging.ERROR):
    log_formatter = logging.Formatter('%(asctime)s %(message)s')
    my_handler = RotatingFileHandler(log_file, mode='a', maxBytes=100 * 1024 * 1024, backupCount=5, encoding=None,
                                     delay=0)
    my_handler.setFormatter(log_formatter)
    my_handler.setLevel(level)
    l = logging.getLogger(logger_name)
    l.addHandler(my_handler)

dir = Path(__file__).parents[1]
log_file = os.path.join(dir, 'logs', 'application.log')
setup_logger('debug', log_file)
log = logging.getLogger('debug') 

然后我像log.error("Hello world")在 python 文件中一样使用它,它工作正常。现在,由于我还有另外 2 个文件,我还在这两个文件中复制了相同的上述代码,tracker.py并且celerio.py. 但问题是,如果我登录log.error("Hello world from app.py"). app.pyapplication.log文件中保存为 3 次。其他文件也是如此。

2019-11-15 13:32:00,288 Hello world from app.py
2019-11-15 13:32:00,288 Hello world from app.py
2019-11-15 13:32:00,288 Hello world from app.py

我不知道为什么它只记录了 1 个日志 3 次。任何人都可以在这方面帮助我。谢谢

4

2 回答 2

1

在设置记录器时,您会一遍又一遍地添加新的处理程序。在添加之前尝试清除它们:

l.handlers[:] = []
于 2019-11-15T13:57:44.717 回答
1

日志系统具有全局状态。通过将此代码添加到所有三个模块中,您将三个处理程序添加到名为“debug”的记录器中。

仅设置一次登录app.py,仅log = logging.getLogger('debug')在您的其他模块中使用。

应用程序.py

def setup_logger(logger_name, log_file, level=logging.ERROR):
    log_formatter = logging.Formatter('%(asctime)s %(message)s')
    my_handler = RotatingFileHandler(log_file, mode='a', maxBytes=100 * 1024 * 1024, backupCount=5, encoding=None,
                                     delay=0)
    my_handler.setFormatter(log_formatter)
    my_handler.setLevel(level)
    l = logging.getLogger(logger_name)
    l.addHandler(my_handler)

dir = Path(__file__).parents[1]
log_file = os.path.join(dir, 'logs', 'application.log')
setup_logger('debug', log_file)
log = logging.getLogger('debug') 

tracker.py 和 celerio.py

import logging
log = logging.getLogger('debug') 
于 2019-11-15T14:11:40.323 回答