Python多处理日志记录-为什么使用multiprocessing.get\u记录器

Python多处理日志记录-为什么使用multiprocessing.get\u记录器,python,logging,multiprocessing,Python,Logging,Multiprocessing,一段时间以来,我一直在努力解决多处理日志记录问题,原因很多 我的一个原因是,为什么另一个得到你 当然,我已经看到了,而且似乎multiprocessing.get_logger返回的记录器执行了一些“进程共享锁”魔术,以使日志处理变得平滑 因此,今天我研究了Python2.7(/multiprocessing/util.py)的多处理代码,发现这个记录器只是一个普通的logging.logger,几乎没有什么神奇之处 下面是Python文档中的描述,就在 获取记录器功能: 对日志记录的一些支持是

一段时间以来,我一直在努力解决多处理日志记录问题,原因很多

我的一个原因是,为什么另一个得到你

当然,我已经看到了,而且似乎multiprocessing.get_logger返回的记录器执行了一些“进程共享锁”魔术,以使日志处理变得平滑

因此,今天我研究了Python2.7(/multiprocessing/util.py)的多处理代码,发现这个记录器只是一个普通的logging.logger,几乎没有什么神奇之处

下面是Python文档中的描述,就在 获取记录器功能:

对日志记录的一些支持是可用的。但是,请注意,日志记录 程序包不使用进程共享锁,因此它是可能的(取决于 在处理程序类型上),以获取来自不同进程的消息 搞混了

因此,当您使用错误的日志处理程序时,即使get_记录器也可能出错? 一段时间以来,我一直在使用一个使用get_logger进行日志记录的程序。 它将日志打印到StreamHandler,而且(似乎)永远不会混淆

现在我的理论是:

  • multiprocessing.get_logger根本不执行进程共享锁
  • StreamHandler适用于多处理,但FileHandler不适用
  • 此get_logger的主要用途是跟踪流程的 生命周期,并提供易于获取和随时可用的记录器 它已经记录了进程的名称/id之类的内容
  • 问题是:

    我的理论正确吗


    您如何/为什么/何时使用此get_logger?

    此答案不是关于
    get_logger
    ,但您可能可以使用中建议的方法?请注意,
    QueueHandler
    /
    QueueListener
    类通过包(也可用)可用于早期的Python版本。

    是的,我相信您是对的,multiprocessing.get\u logger()不处理共享锁-正如您所说,文档甚至说明了这一点。尽管有这么多的投票,但看起来你链接到的链接在声明它确实存在缺陷(为了让人怀疑,它是十多年前写的,所以可能在某一点上是这样的)

    为什么多处理.get_logger()会存在?政府说:

    返回多处理使用的记录器。如有必要,将创建一个新的

    首次创建时,记录器具有level logging.NOTSET,并且没有默认处理程序。默认情况下,发送到此记录器的消息不会传播到根记录器

    i、 e.默认情况下,多处理模块不会生成任何日志输出,因为其记录器的日志记录级别设置为NOTSET,因此不会生成日志消息

    如果您的代码有问题,并且怀疑这是多处理的问题,那么缺少日志输出对调试没有帮助,这就是多处理。get_logger()exists for-它返回多处理模块本身使用的记录器,以便您可以覆盖默认日志配置,从中获取一些日志,并查看它在做什么

    由于您询问了如何使用multiprocessing.get_logger(),因此您可以这样调用它,并以通常的方式配置记录器,例如:

    logger = multiprocessing.get_logger()
    formatter = logging.Formatter('[%(levelname)s/%(processName)s] %(message)s')
    handler = logging.StreamHandler()
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logger.setLevel(logging.INFO)
    
    # now run your multiprocessing code
    
    也就是说,为了方便起见,您实际上可能希望使用multiprocessing.log_to_stderr(),如下所示:

    此函数执行对get_logger()的调用,但除了返回由get_logger创建的记录器外,它还添加了一个处理程序,该处理程序使用格式
    '[%(levelname)s/%(processName)s]%(message)s'

    i、 e.这样您就不需要自己设置太多日志配置,您只需使用以下工具即可开始调试多处理问题:

    logger = multiprocessing.log_to_stderr()
    logger.setLevel(logging.INFO)
    
    # now run your multiprocessing code
    

    不过重申一下,这只是一个正在配置和使用的普通模块记录器,也就是说,它没有任何特殊或过程安全性。它只是让您看到多处理模块内部发生的事情。

    很抱歉,我不能访问blobspot,因为我所在的地方,我知道您的帖子是关于多处理友好日志的,谢谢。关于这一点,我实际上打算在我的项目中使用zmq.log(使用zmq.:-),所以在您的回答中还要添加这一点,即multiprocessing.get_logger()不可用于跨多个进程进行日志记录!许多开发人员认为,这种方法将为他们提供一种进程安全的日志功能,并可用于在FileHandler旁边使用它来跨进程并发日志记录,因此他们除了进程共享锁等之外,还澄清了multiprocessing.get_logger()与其他日志记录程序一样是一种普通的日志记录程序!今天,您可以看到许多模块提供了可定制的日志功能,以查看模块内部到底发生了什么,因此multiprocessing.get_logger()返回的记录器与它们一样。谢谢-我添加了一个总结段落,以确保读者清楚。