Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为同时存在的不同Python对象登录到不同的文件_Python_Logging_Python Logging - Fatal编程技术网

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

为同时存在的不同Python对象登录到不同的文件,python,logging,python-logging,Python,Logging,Python Logging,对于下面的MWE,我希望能够创建两个ModelObjects,然后在以后运行model对象。实际上,有数量未知的ModelObjects和许多步骤组成了run操作,但这涵盖了这个概念 我想从日志中得到的是一个.log文件,该文件记录单个ModelObject的所有日志信息、警告等,而不记录其他模型的任何信息 import logging class ModelObject(object): def __init__(self, i): self.i = i

对于下面的MWE,我希望能够创建两个
ModelObject
s,然后在以后运行
model对象。实际上,有数量未知的
ModelObject
s和许多步骤组成了
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.log
logs/log_1.log
,但在创建日志后,所有信息都会记录到每个文件中

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

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

我认为您的问题来自
logging
返回相同的日志对象这一事实。从python文档中:

然后,您将添加文件处理程序,这些处理程序应该将单独的对象添加到一个对象中,以便将其记录到相同的文件中

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

哇,我甚至在文档中读到了这一点,并对自己说“不,它们有不同的名称”,因为我考虑的是文件名,而不是
getLogger
调用。哼!非常感谢,现在一切正常。
# log_1.log
finished initialization in 1
running job in 0
running job in 1