官方的nginx docker image( Dockerfile )使用以下技巧将其日志交给stdout和stderr,以便docker日志采集器捕获这些日志并使用docker logs <container-name> :
# forward request and error logs to docker log collector RUN ln -sf /dev/stdout /var/log/nginx/access.log RUN ln -sf /dev/stderr /var/log/nginx/error.log
我想要做同样的事情,但是我在我的容器中拥有supervisord作为PID 1,它监督nginx进程并捕获stdout和stderr并将其放入它自己的日志文件中。 因此日志不能到达docker日志收集器。
这是我的supervisord.conf中的相关块
[program:nginx] command=/usr/sbin/nginx -g "daemon off;" priority=990 ; NOTE: We do not want to redirect stdout and stderr of a nginx process to a logfile because we want docker log collector to get them. stdout_logfile= NOT SURE WHAT TO PUT HERE? stderr_logfile= NOT SURE WHAT TO PUT HERE? username=www-data autorestart=true
supervisord文档是伟大的( http://supervisord.org/configuration.html ),但对于stdout_logfile他们不给我我需要的答案 – 即,如何configurationsupervisord不拦截进程stdout / stderr(或捕获到一个日志文件,但也转发到正常的标准输出/标准错误)。
我已经尝试过了:
stdout_logfile=NONE – 不会获取日志既不是stdout也不是文件 stdout_logfile=/var/log/supervisor/%(program_name)s.log – 获取日志到一个文件,但不是标准输出。 stdout_logfile – 获取日志到一个随机命名的文件,但不是标准输出。 stdout_logfile=/dev/stdout – Supervisord发生错误:
CRIT未捕获的pythonexception,closures通道(stdout)>(:[Errno 29]非法查找[/usr/lib/python2.7/dist-packages/supervisor/supervisord.py|runforever|233] [/ usr / lib / python2 .7 / dist-packages / supervisor / dispatchers.py | handle_read_event | 231] [/usr/lib/python2.7/dist-packages/supervisor/dispatchers.py |record_output | 165] [/usr/lib/python2.7 /dist-packages/supervisor/dispatchers.py|_log|141] [/usr/lib/python2.7/dist-packages/supervisor/loggers.py|info|273] [/usr/lib/python2.7/dist -packages / supervisor / loggers.py | log | 291] [/usr/lib/python2.7/dist-packages/supervisor/loggers.py|emit|186] [/usr/lib/python2.7/dist-packages /supervisor/loggers.py|doRollover|195])
Illegal seek错误是由supervisord中负责日志文件旋转的代码引起的。 要redirect到stdout / stderr,您必须禁用日志文件旋转,如下所述:
http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html