【问题标题】:Logging from the children of a supervisord subprocess从 supervisord 子进程的子进程中记录
【发布时间】:2016-01-07 09:46:57
【问题描述】:

我的系统由一个从 supervisord 启动的 python 应用程序组成。我们称之为AA 启动一个子进程B 来完成它的一些任务。 AB 都是用 Python 编码的,并使用标准的 logging 模块将消息输出到控制台。

Astdoutstderr 记录到 supervisord 配置中指定的文件。这就像一个魅力。现在,我想将stdoutstderrB 传送到与A 相同的文件中。如何实现?

【问题讨论】:

  • 听起来您应该能够使用与在A 中使用的相同的代码来记录B。你能告诉我们你的代码吗?

标签: python subprocess supervisord


【解决方案1】:

你不需要做任何事情。 B默认继承A的标准流。

如果 A 的标准输出被重定向到一个文件,那么 B 的标准输出会自动写入同一个位置。

【讨论】:

    【解决方案2】:

    Python 子进程模块提供了读取子标准输出和标准错误的工具。您可以捕获它们并将它们发送到您的记录器。下面是一个执行后版本,它在子进程完成后将所有输出发送到日志。也可以逐行执行此操作,您可以在 StackOverflow 中找到逐行读取 subprocess stdout 的示例。

      worker = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
      worker.wait()
      logger.debug("Subprocess %s stdout: %s", cmdline, worker.stdout.read().decode("utf-8"))
    

    【讨论】:

    • 感谢您让我朝着正确的方向前进。我想知道是否没有办法以某种神奇的方式设置日志记录模块,以绕过可能对 B 的 stdout/stderr 进行的任何处理并直接转储到日志文件中。
    • 投反对票。不要使用stdout=PIPE,除非您从管道中读取,否则孩子可能会在其操作系统标准输出管道缓冲区填满后立即挂起(在您的情况下,当父级在worker.wait() 上被阻塞时,孩子可能会挂起——死锁)。
    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 2013-09-26
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多