【问题标题】:logging from python multiprocessing, one logfile per thread, log-messages from imported module(s)来自 python 多处理的日志记录,每个线程一个日志文件,来自导入模块的日志消息
【发布时间】:2015-05-03 02:21:03
【问题描述】:

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

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__)

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

有什么方法可以获取每个实例的日志文件,其中来自导入模块的日志消息也被写入这些文件?

【问题讨论】:

    标签: python-2.7 logging python-multiprocessing


    【解决方案1】:
    class Foo():
        def __init__(self, name):
            self.logger = logging.getLogger()
    

    这不起作用,因为作为the documentation states,不带参数调用getLogger 只会返回根记录器(始终相同)。

    如果您希望类实例的记录器成为其他人的子级,则需要明确说明。所以,如果你的模块记录器被命名为X,你可以这样做

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

    【讨论】:

    • 感谢您的快速回复!实际上,我想要的是 module_logger 是类记录器的子类,如果我明确地为类记录器命名,这将不起作用,因为我需要将类实例记录器的名称传递给导入的模块.
    • @Steffen 我认为让模块记录器成为类实例中记录器的子级没有多大意义 - 也许您误解了模块的工作原理?模块独立于任何此类实例和任何import 语句而存在。如果你在多个地方import 一个模块,你会得到对同一个对象的引用
    猜你喜欢
    • 2012-02-08
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2015-10-09
    • 1970-01-01
    • 2012-12-19
    相关资源
    最近更新 更多