0

我目前正在尝试从多个进程登录到单个文件,但我遇到了很多麻烦。我花了无数个小时在网上寻找——stackoverflow 和谷歌,但没有想出任何具体的东西。

我已阅读:在 Python 中使用多处理时我应该如何记录?

我一直在尝试使用 zzzeek 的代码,但它并没有为我写入文件。我没有具体的方法——我只是在尽我所能尝试。

你们有没有人让它工作并有示例代码,或者你有另一种方法。我需要将多个进程记录到同一个文件中。我还想将各种类的任何错误记录到同一个文件中。然而,我对简单地让多进程工作感到满意。

谢谢

4

2 回答 2

1

下面是一些适用于 zzzeek 处理程序的示例代码:

mtlog = MultiProcessingLog('foo.log', 'a', 0, 0)
logging.getLogger().addHandler(mtlog)

def task(_):
    logging.error('Hi from {}'.format(os.getpid()))

p = multiprocessing.Pool()
p.map(task, range(4))

这是我的运行:

$ python mtlog.py
$ cat foo.log
Hi from 6179
Hi from 6180
Hi from 6181
Hi from 6182

事实上,我想出的任何微不足道的测试都可以正常工作。很明显,在你所有的尝试中,你都做错了,可能是同一件事。


我的第一个猜测是您正在尝试在 Windows 上使用它。正如诺亚耶特的评论所说:

不幸的是,这种方法不适用于 Windows。来自 docs.python.org/library/multiprocessing.html 16.6.2.12 “请注意,在 Windows 上,子进程只会继承父进程的记录器的级别——不会继承记录器的任何其他自定义。” 子进程不会继承处理程序,并且您不能显式传递它,因为它不可腌制。

尽管 zzzeek 回复说他认为它会起作用,但我 90% 肯定他错了:

我认为这仅指硬连线到多处理模块中的记录器。这个配方没有使用它,也不应该关心日志级别的传播,它只是使用普通的多处理通道将数据从子节点传递到父节点。

那完全是倒退。日志级别的传播确实有效;addHandler不传播。_

要完成这项工作,您需要将queue显式传递给孩子,并以此构建孩子端记录器。

于 2013-07-10T23:03:47.883 回答