所以,通过uWSGI试用Docker + Supervisord + Django应用程序。我整个堆栈工作正常,但需要整理日志。
如果我以非守护进程模式启动主管,
/usr/bin/supervisord -n
然后我将主管的日志输出播放到docker logs stdout中。但是,如果supervisord处于守护进程模式,它自己的日志会被隐藏在容器文件系统中,并且其应用程序的日志也会在自己的app__stderr / stdout文件中执行。
我想要的是将supervisor和application stdout记录到docker日志中。
在非守护进程模式下启动监督是一个明智的想法,还是会导致意想不到的后果?另外,如何将应用程序日志也播放到docker日志中?
答案 0 :(得分:36)
我用这个完成了。
在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
答案 1 :(得分:17)
Docker容器就像一个面巾纸,你使用它然后你放弃它。为了“活着”,Docker需要在前台运行的东西(而守护进程在后台运行),这就是你使用Supervisord的原因。
因此,您需要将过程输出(访问和错误)“重定向/添加/合并”到运行容器时看到的Supervisord输出。
正如Drew所说,每个人都在使用https://github.com/coderanger/supervisor-stdout来实现它(对我而言,这应该被添加到supervisord项目中!)。德鲁忘了说,你可能需要添加
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
到supervisord程序配置块。
还有一些非常有用的东西,想象你的进程是登录日志文件而不是stdout,你可以请求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。
答案 2 :(得分:12)
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
答案 3 :(得分:5)
我同意,不使用守护进程模式听起来像是最好的解决方案,但我可能会采用您在使用实际物理服务器或某种VM设置时使用的相同策略:集中记录。
您可以在容器中使用像logstash这样的自托管内容来收集日志并将其发送到中央服务器。或者使用像loggly或papertrail这样的商业服务来做同样的事情。
答案 4 :(得分:1)
今天的最佳做法是拥有最少的Docker镜像。对我来说,使用Python应用程序的理想容器只包含我的代码,支持库和uwsgi
之类的东西(如果有必要)。
我在https://github.com/msgre/uwsgi_logging上发布了一个解决方案。它是uwsgi
后面的简单Django应用程序,它被配置为在容器stdout上显示来自uwsgi
和Django app的日志,而不需要supervisor
。
答案 5 :(得分:0)
实际上,在非守护进程模式下启动supervisord是最佳解决方案。
您还可以使用卷来将supervisord的日志安装到中心位置。
答案 6 :(得分:0)
我的python应用程序(Flask)遇到了同样的问题。对我有用的解决方案是:
supervisord -n
)中启动 supervisord 将日志重定向到/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