Python 2.7 来自python多处理的日志记录,每个线程一个日志文件,来自导入模块的日志消息
我有一个python脚本,它启动一个类foo的多个实例,然后使用multiprocessing.pool.map执行该类的“run”方法,如下所示:Python 2.7 来自python多处理的日志记录,每个线程一个日志文件,来自导入模块的日志消息,python-2.7,logging,python-multiprocessing,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.
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)
self.logger = getLogger(name + '_logger')
module_logger = logging.getLogger(__name__)
这很有效。给我带来麻烦的是,在类的构造函数中启动了logger和filehandler,我想为类的每个实例创建一个单独的日志文件:
class Foo():
def __init__(self, name):
self.logger = logging.getLogger()
self.logfile = logging.FileHandler(name + '.log')
(我省略了格式化程序和日志级别,因为这不是这个问题的一部分。)现在的问题是,通过上述方法,我每个实例都会得到一个日志文件,但是来自所有实例的日志消息都会进入每个日志文件。
如果我给记录器命名,如下所示:
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)
self.logger = getLogger(name + '_logger')
module_logger = logging.getLogger(__name__)
然后,日志消息将正确分配给文件,但所有来自导入模块的日志消息,我在其中初始化了模块记录器,如下所示:
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)
self.logger = getLogger(name + '_logger')
module_logger = logging.getLogger(__name__)
将不再显示在日志文件中,因为模块记录器不会将类实例中不同名称的记录器识别为父记录器(这与上述方法完全一致)
是否有任何方法可以获取每个实例的日志文件,并将导入模块的日志消息写入这些文件
class Foo():
def __init__(self, name):
self.logger = logging.getLogger()
这是行不通的,因为,如不带参数调用getLogger
,只会返回根记录器(总是相同的)
如果您想让类实例的记录器成为其他实例的子对象,那么需要显式地进行设置。因此,如果您的模块记录器名为X
,则您可以
self.logger=getLogger(X+“+name+”\u logger')
感谢您的快速回复!实际上,我想让module_logger成为类logger的子类,如果我显式地给类logger命名,这将不起作用,因为我需要将类实例记录器的名称传递给导入的模块。@Steffen我认为将模块记录器作为类实例中记录器的子级没有多大意义-也许您误解了模块的工作方式?模块独立于任何此类实例和任何import
语句而存在。如果在多个位置导入模块,则会得到对同一对象的引用