27

因此,通过 uWSGI 试验 Docker + Supervisord + Django 应用程序。我的整个堆栈工作正常,但需要整理日志记录。

如果我以非守护程序模式启动主管,

/usr/bin/supervisord -n

然后我将主管的日志记录输出播放到 docker logs 标准输出中。但是,如果 supervisord 处于守护程序模式,它自己的日志会被隐藏在容器文件系统中,并且它的应用程序的日志也会 - 在它们自己的 app__stderr/stdout 文件中。

我想要的是将主管和应用程序标准输出记录到 docker 日志中。

在非守护程序模式下启动 supervisord 是一个明智的想法,还是会导致意想不到的后果?另外,如何让应用程序日志也播放到 docker 日志中?

4

7 回答 7

40

我使用 .

在 Docker 镜像中安装supervisor-stdout :

RUN apt-get install -y python-pip && pip install supervisor-stdout

监督配置

supervisord.conf像这样编辑您的外观:

[program:myprogram]
command=/what/ever/command
stdout_events_enabled=true
stderr_events_enabled=true

[eventlistener:stdout] 
command = supervisor_stdout 
buffer_size = 100 
events = PROCESS_LOG 
result_handler = supervisor_stdout:event_handler
于 2014-01-27T00:17:33.570 回答
24

Docker 容器就像面巾纸,你使用它然后放下它。为了“活着”,Docker 需要在前台运行一些东西(而守护进程在后台运行),这就是你使用 Supervisord 的原因。

因此,您需要将进程输出(访问和错误)“重定向/添加/合并”到运行容器时看到的 Supervisord 输出。

正如 Drew 所说,每个人都在使用https://github.com/coderanger/supervisor-stdout来实现它(对我来说这应该添加到 supervisord 项目中!)。德鲁忘了说的东西,你可能需要补充

stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0

到 supervisord 程序配置块。

一些非常有用的东西,想象你的进程正在登录一个日志文件而不是标准输出,你可以让 supervisord 观看它:

[program:php-fpm-log]
command=tail -f /var/log/php5-fpm.log
stdout_events_enabled=true
stderr_events_enabled=true

这会将 php5-fpm.log 内容重定向到 stdout,然后通过 supervisord-stdout 重定向到 supervisord stdout。

于 2015-02-21T10:25:29.050 回答
19

supervisor-stdout 需要安装 python-pip,它下载 ~150mb,对于一个我认为只是安装另一个工具的容器。

将日志文件重定向到 /dev/stdout 对我有用:

stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0

http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html

于 2016-08-24T15:44:47.160 回答
7

我同意,不使用守护程序模式听起来是最好的解决方案,但我可能会采用与您在拥有实际物理服务器或某种 VM 设置时使用的策略相同的策略:集中日志记录。

您可以在容器内使用诸如logstash之类的自托管内容来收集日志并将其发送到中央服务器。或者使用像 loggly 或 papertrail 这样的商业服务来做同样的事情。

于 2013-09-20T23:02:31.287 回答
1

今天的最佳实践是拥有最少的 Docker 镜像。对我来说,带有 Python 应用程序的理想容器只包含我的代码、支持库和类似的东西(uwsgi如果有必要的话)。

我在https://github.com/msgre/uwsgi_logging上发布了一个解决方案。它是一个简单的 Django 应用程序,uwsgi它被配置为uwsgi在容器标准输出上显示来自 Django 应用程序的日志,而无需supervisor.

于 2016-02-24T19:30:20.633 回答
0

事实上,以非守护程序模式启动 supervisord 是最好的解决方案。

您还可以使用卷来将 supervisord 的日志挂载到一个中心位置。

于 2013-09-14T00:30:31.237 回答
0

我的 python 应用程序(Flask)也有同样的问题。对我有用的解决方案是:

  • 在 nodaemon 模式下启动supervisordsupervisord -n ( )
  • 将日志重定向到/proc/1/fd/1而不是/dev/stdout

  • 在我的 docker 映像中设置这两个环境变量, PYTHONUNBUFFERED=True然后PYTHONIOENCODING=UTF-8

只需将以下行添加到您各自的 supervisor.ini 配置文件中。

redirect_stderr=true
stdout_logfile=/proc/1/fd/1

将这些变量导出到应用程序 (linux) 环境。

$ export PYTHONUNBUFFERED=True 
$ export PYTHONIOENCODING=UTF-8
于 2020-06-17T07:59:39.207 回答