2015-03-02 47 views
1

我有一个python脚本启动一个类foo的多个实例,然后使用multiprocessing.pool执行该类的方法“运行” .map像这样:从python多处理日志文件,每个线程一个日志文件,来自导入模块的日志消息

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) 

它工作得很好。给我的麻烦事是,在类中的记录和文件处理器的构造开始,我希望有一个独立的日志文件的类的每个实例:

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
class Foo(): 
    def __init__(self, name): 
     self.logger = logging.getLogger() 

这是不行的,因为作为the documentation states,调用getLogger不带参数只返回根记录器(这始终是一样的)。

如果您希望类实例的记录器是其他人的孩子,您需要明确地做到这一点。所以,如果你的模块记录器被命名为X,你做

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

+0

感谢您的快速回复! 实际上,我想要的是,module_logger是类记录器的子类,如果我明确给类记录器命名,那么这将不起作用,因为我然后需要将类实例记录器的名称传递给进口模块。 – Steffen 2015-03-02 17:00:31

+0

@Steffen我认为将模块记录器作为类实例中的记录器的孩子是不合理的 - 也许您误解了模块的工作方式?一个模块独立于任何这样的实例以及任何“import”语句而存在。如果你在多个地方导入一个模块,你会得到同一个对象的引用 – goncalopp 2015-03-02 17:15:21