gpt4 book ai didi

Python 记录重复行

转载 作者:行者123 更新时间:2023-11-28 22:46:36 26 4
gpt4 key购买 nike

我的问题是设计问题。我有以下 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 类,错误必须在我的 Logger 类中,但我假设带有记录器名称的 getLogger 将返回“相同”日志记录类实例。

最佳答案

您的假设是正确的,并且是问题的原因。您在此处将许多处理程序添加到同一个记录器:

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

同一个记录器得到更多的处理程序。

关于Python 记录重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27253112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com