19

一段时间以来,我一直在为多处理日志而苦苦挣扎,原因有很多。

我的一个原因是,为什么另一个 get_logger.

当然,我已经看到了这个问题,而且 multiprocessing.get_logger 返回的记录器似乎做了一些“进程共享锁”的魔法来使记录处理顺利进行。

所以,今天我查看了 Python 2.7 的多处理代码(/multiprocessing/util.py),发现这个 logger 只是一个普通的 logging.Logger,几乎没有任何魔法。

这是 Python 文档中的描述,就在 get_logger 函数之前:

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

所以当你使用错误的日志处理程序时,即使是 get_logger 记录器也可能出错?我已经使用了一个程序使用 get_logger 进行日志记录一段时间。它将日志打印到 StreamHandler 并且(似乎)永远不会混淆。

现在我的理论是:

  1. multiprocessing.get_logger 根本不做进程共享锁
  2. StreamHandler 适用于多处理,但 FileHandler 不适用
  3. 这个 get_logger 记录器的主要目的是跟踪进程的生命周期,并提供一个易于获取和准备使用的记录器,该记录器已经记录了进程的名称/ID 类型的东西

这是问题:

我的理论对吗?

如何/为什么/何时使用这个 get_logger?

4

2 回答 2

7

是的,我相信 multiprocessing.get_logger() 不做进程共享锁是对的——正如你所说,文档甚至声明了这一点。尽管有所有的赞成票,但您链接到的问题似乎在说明它确实存在方面存在缺陷(为了避免怀疑,它是在十多年前写的 - 所以也许有一段时间就是这种情况)。

那么为什么 multiprocessing.get_logger() 存在呢?文档说:

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

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

即,默认情况下,多处理模块不会产生任何日志输出,因为它的记录器的日志记录级别设置为 NOTSET,因此不会产生日志消息。

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

由于您询问如何使用 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 创建的记录器外,它还添加了一个处理程序,该处理程序使用格式将输出发送到 sys.stderr'[%(levelname)s/%(processName)s] %(message)s'

即它节省了您自己设置大量日志记录配置的需要,您可以改为开始调试您的多处理问题:

logger = multiprocessing.log_to_stderr()
logger.setLevel(logging.INFO)

# now run your multiprocessing code

重申一下,这只是一个正在配置和使用的普通模块记录器,即没有什么特别的或过程安全的。它只是让您查看多处理模块本身内部发生的情况。

于 2020-05-28T22:15:55.157 回答
3

这个答案不是get_logger具体的,但也许你可以使用这篇文章中建议的方法?请注意,QueueHandler/QueueListener类可通过logutils包用于早期 Python 版本(也可在 PyPI 上获得)。

于 2012-11-23T11:33:38.307 回答