A imagem oficial do nginx docker ( Dockerfile ) usa o seguinte truque para enviar seus logs para stdout e stderr para que sejam capturados pelo coletor de log do docker e visualizados usando 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
Eu quero fazer o mesmo, porém tenho supervisord como PID 1 em meu contêiner e ele supervisiona o processo nginx e captura stdout e stderr e o coloca em seu próprio arquivo de log. Portanto, os logs não alcançam o coletor de log do docker.
Aqui está o bloco relevante no meu 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
Os documentos do supervisord são ótimos ( http://supervisord.org/configuration.html ), mas stdout_logfile
não me dão a resposta de que preciso - ou seja, como configuro o supervisord para não interceptar um processo stdout / stderr ( ou para capturar para um arquivo de log, mas também encaminhar para stdout / stderr normal).
O que eu já tentei:
stdout_logfile=NONE
- Não obtenha logs nem stdout ou para um arquivostdout_logfile=/var/log/supervisor/%(program_name)s.log
- Obter logs para um arquivo, mas não stdout.- Não definindo
stdout_logfile
- Obtenha logs para um arquivo nomeado aleatoriamente, mas não stdout. stdout_logfile=/dev/stdout
- O supervisor dá um erro:Exceção python não capturada CRIT, canal de fechamento (stdout)> (:[Errno 29] Busca ilegal [/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])
O
Illegal seek
erro é causado pelo código no supervisord que é responsável pela rotação do arquivo de log. Para redirecionar para stdout/stderr, você deve desabilitar a rotação do arquivo de log, conforme explicado aqui:http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html