我有一个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__)
将不再显示在日志文件中,因为模块记录器不能识别类实例中与父记录器不同的命名记录器(它完全符合上述方法)。
有没有什么办法可以获得每个实例的日志文件,这些日志文件包含来自导入模块的日志消息,这些日志消息也被写入这些文件?
感谢您的快速回复! 实际上,我想要的是,module_logger是类记录器的子类,如果我明确给类记录器命名,那么这将不起作用,因为我然后需要将类实例记录器的名称传递给进口模块。 – Steffen 2015-03-02 17:00:31
@Steffen我认为将模块记录器作为类实例中的记录器的孩子是不合理的 - 也许您误解了模块的工作方式?一个模块独立于任何这样的实例以及任何“import”语句而存在。如果你在多个地方导入一个模块,你会得到同一个对象的引用 – goncalopp 2015-03-02 17:15:21