为同时存在的不同 Python 个对象记录到不同的文件

Log to different files for different Python objects that exist simultaneously

对于下面的 MWE,我希望能够创建两个 ModelObject,然后在稍后创建 run 模型对象。实际上,有未知数量的 ModelObject 和许多步骤组成 run 动作,但这涵盖了这个想法。

我想要的日志记录是有一个 .log 文件来记录个人 ModelObject 的所有日志信息、警告等,而其他模型则没有。

import logging

class ModelObject(object):
    def __init__(self, i):

        self.i = i

        self.logger = logging.getLogger('driver')
        self.logger.setLevel(logging.INFO)

        fh = logging.FileHandler('logs/log_'+str(self.i)+'.log')
        self.logger.addHandler(fh)
        
        self.logger.info('finished initialization in %s' % self.i)

    def run(self):
        self.logger.info('running job in %s' % self.i)


if __name__ == '__main__':

    objs_list = []
    for i in range(2):
        objs_list.append(ModelObject(i))

    ## later, want to run the jobs
    for i in range(2):
        objs_list[i].run()

MWE 正确生成日志文件 logs/log_0.loglogs/log_1.log,但在创建该日志后,所有信息都会记录到每个文件中。

# log_0.log
finished initialization in 0
finished initialization in 1
running job in 0
running job in 1
# log_1.log
finished initialization in 1
running job in 0
running job in 1

如何只写入单个对象的单个日志文件(即每个对象 self.logger)?

我认为您的问题是因为 logging 返回了相同的记录器对象。来自 python 文档:"Multiple calls to getLogger() with the same name will always return a reference to the same Logger object."

然后您添加了文件处理程序,这些文件处理程序应该将对象分离到一个对象,因此它会将其记录到相同的文件中。

你想做的可能是 self.logger = logging.getLogger(str(i))