【问题标题】:Python MultiProcess, Logging, Various ClassesPython 多进程、日志记录、各种类
【发布时间】:2013-07-10 22:38:47
【问题描述】:

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

我已阅读:How should I log while using multiprocessing in Python?

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

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

谢谢

【问题讨论】:

  • 你能告诉我们你正在使用的使用 zzzeek 处理程序的代码吗?因为如果您只是使用错误,如果我们不知道您的使用方式,我们将无法调试。我知道你说过“我一直在尽我所能”,但你必须至少向我们展示一种方法。

标签: python logging multiprocessing multiprocess


【解决方案1】:
【解决方案2】:

下面是一些适用于 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% 确定他错了:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多