O erro Illegal seek
é causado pelo código no supervisord que é responsável pela rotação do arquivo de log. Para redirecionar para stdout / stderr, você precisa desativar a rotação do arquivo de log, conforme explicado aqui:
A imagem oficial da janela de encaixe do nginx ( Dockerfile ) usa o seguinte truque para transferir seus registros para a stdout e stderr para que eles sejam capturados pelo coletor de log do docker e possam ser 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, no entanto tenho supervisord como PID 1 no 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 ( link ), mas para stdout_logfile
eles não me dão a resposta que eu preciso - ou seja, , como faço para configurar o supervisord para não interceptar um processo stdout / stderr (ou para capturar um arquivo de log, mas também encaminhar para o stdout / stderr normal).
O que eu já tentei:
stdout_logfile=NONE
- não obtém registros nem stdout nem em um arquivo stdout_logfile=/var/log/supervisor/%(program_name)s.log
- Obtém logs em um arquivo, mas não em stdout. stdout_logfile
- Obter logs para um arquivo nomeado aleatoriamente, mas não stdout. stdout_logfile=/dev/stdout
- Supervisord dá um erro:
CRIT exceção de python não capturada, 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 erro Illegal seek
é causado pelo código no supervisord que é responsável pela rotação do arquivo de log. Para redirecionar para stdout / stderr, você precisa desativar a rotação do arquivo de log, conforme explicado aqui:
Tags nginx docker logging supervisord