我目前正在尝试从多个进程登录到单个文件,但我遇到了很多麻烦。我花了无数个小时在网上看看 - stackoverflow和谷歌,但没有提出任何具体的建议。
我看过:How should I log while using multiprocessing in Python?
我一直在尝试使用zzzeek的代码,但它不会为我写入文件。我没有具体的方式我这样做 - 我只是尽力而为。
有没有人让它工作并有示例代码,或者你有另一种方法可以做到这一点。我需要将多个进程记录到同一个文件中。我还想将各种类的错误记录到同一个文件中。但是,我很满意简单地让多进程工作。
由于
答案 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
显式传递给子节点,并构建子节点记录器。