我目前正在尝试从多个进程登录到单个文件,但我遇到了很多麻烦。我花了无数个小时在网上寻找——stackoverflow 和谷歌,但没有想出任何具体的东西。
我一直在尝试使用 zzzeek 的代码,但它并没有为我写入文件。我没有具体的方法——我只是在尽我所能尝试。
你们有没有人让它工作并有示例代码,或者你有另一种方法。我需要将多个进程记录到同一个文件中。我还想将各种类的任何错误记录到同一个文件中。然而,我对简单地让多进程工作感到满意。
谢谢
我目前正在尝试从多个进程登录到单个文件,但我遇到了很多麻烦。我花了无数个小时在网上寻找——stackoverflow 和谷歌,但没有想出任何具体的东西。
我一直在尝试使用 zzzeek 的代码,但它并没有为我写入文件。我没有具体的方法——我只是在尽我所能尝试。
你们有没有人让它工作并有示例代码,或者你有另一种方法。我需要将多个进程记录到同一个文件中。我还想将各种类的任何错误记录到同一个文件中。然而,我对简单地让多进程工作感到满意。
谢谢
下面是一些适用于 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
显式传递给孩子,并以此构建孩子端记录器。