从python多处理记录,每个线程一个日志文件,来自导入模块的日志消息

时间:2015-03-02 16:30:11

标签: python-2.7 logging python-multiprocessing

我有一个python脚本,它启动类foo的多个实例,然后使用multiprocessing.pool.map执行类的'run'方法,如下所示:

import multiprocessing.dummy as mp
import foo_class

def run_instance(instance):
    return instance.run()

for arguments in list_of_arguments:
    instances.append(foo_class.Foo(arguments))

mp.pool.map(run_instance, instances)

效果很好。给我带来麻烦的是,在类的构造函数中启动了一个logger和filehandler,我希望为该类的每个实例都有一个单独的日志文件:

class Foo():
    def __init__(self, name):
        self.logger = logging.getLogger()
        self.logfile = logging.FileHandler(name + '.log')

(我省略了格式化程序和日志级别,因为它不是这个问题的一部分。)现在的问题是,通过上述方式,我为每个实例获取一个日志文件,但是来自所有实例的日志消息进入每个日志文件。 如果我将记录器命名为:

self.logger = getLogger(name + '_logger')

然后将正确地将日志消息分配给文件,但是来自导入模块的所有日志消息,其中我初始化模块记录器如下:

module_logger = logging.getLogger(__name__)

将不再显示在日志文件中,因为模块记录器无法将类实例中的不同命名的记录器识别为父记录器(这与上述方法完美配合)。

有没有办法获取每个实例的日志文件,导入的模块中的日志消息也被写入这些文件?

1 个答案:

答案 0 :(得分:1)

class Foo():
    def __init__(self, name):
        self.logger = logging.getLogger()

这不起作用,因为作为the documentation states,在没有参数的情况下调用getLogger只会返回根记录器(总是相同的)。

如果你想要班级实例'记录器是别人的孩子,你需要明确地做出来。因此,如果您的模块记录器名为X,则执行

self.logger = getLogger(X + "." + name + '_logger')