Docker,Supervisord和logging - 如何整合docker日志中的日志?

时间:2013-09-08 12:44:21

标签: python django logging supervisord docker

所以,通过uWSGI试用Docker + Supervisord + Django应用程序。我整个堆栈工作正常,但需要整理日志。

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

/usr/bin/supervisord -n

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

我想要的是将supervisor和application stdout记录到docker日志中。

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

7 个答案:

答案 0 :(得分:36)

我用这个完成了。

在Docker镜像中安装supervisor-stdout

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

Supervisord配置

编辑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)遇到了同样的问题。对我有用的解决方案是:

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

  • 在我的docker映像PYTHONUNBUFFERED=TruePYTHONIOENCODING=UTF-8

  • 中设置这两个环境变量

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

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

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

$ export PYTHONUNBUFFERED=True 
$ export PYTHONIOENCODING=UTF-8