Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 2.7 来自python多处理的日志记录,每个线程一个日志文件,来自导入模块的日志消息_Python 2.7_Logging_Python Multiprocessing - Fatal编程技术网

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

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.

我有一个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)
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
语句而存在。如果在多个位置导入模块,则会得到对同一对象的引用