Python多进程,日志记录,各种类

时间:2013-07-10 22:38:47

标签: python logging multiprocessing multiprocess

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

我看过:How should I log while using multiprocessing in Python?

我一直在尝试使用zzzeek的代码,但它不会为我写入文件。我没有具体的方式我这样做 - 我只是尽力而为。

有没有人让它工作并有示例代码,或者你有另一种方法可以做到这一点。我需要将多个进程记录到同一个文件中。我还想将各种类的错误记录到同一个文件中。但是,我很满意简单地让多进程工作。

由于

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分: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上使用它。正如Noah Yetter的评论所说:

  

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

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

  

我认为这只涉及硬连线到多处理模块的记录器。这个配方没有使用它,也不关心loglevels的传播,它只是使用普通的多处理通道将数据从子节点传送到父节点。

这完全落后了。日志级别的传播工作; addHandler的传播

为了完成这项工作,您需要将queue显式传递给子节点,并构建子节点记录器。

相关问题