Nginx: Como usar o coletor de log do docker quando o nginx está sendo executado sob supervisão

6

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:

  1. stdout_logfile=NONE - não obtém registros nem stdout nem em um arquivo
  2. stdout_logfile=/var/log/supervisor/%(program_name)s.log - Obtém logs em um arquivo, mas não em stdout.
  3. Não definindo stdout_logfile - Obter logs para um arquivo nomeado aleatoriamente, mas não stdout.
  4. 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] )

por Tom 07.01.2015 / 12:38

1 resposta

9

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:

link

    
por 08.01.2015 / 20:54