8 votes

Nginx : Comment utiliser le collecteur de logs de Docker lorsque nginx est exécuté sous supervision ?

L'image docker officielle de nginx ( Dockerfile ) utilise l'astuce suivante pour transmettre ses journaux à stdout et stderr afin qu'ils soient capturés par le collecteur de journaux de Docker et consultables à l'aide de la commande 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

Je veux faire la même chose, mais j'ai supervisord comme PID 1 dans mon conteneur et il supervise le processus nginx et capture stdout et stderr et le met dans son propre fichier journal. Par conséquent, les journaux n'atteignent pas le collecteur de journaux de docker.

Voici le bloc correspondant dans mon 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

Les documents du superviseur sont excellents ( http://supervisord.org/configuration.html ) mais pour stdout_logfile ils ne me donnent pas la réponse dont j'ai besoin - à savoir, comment puis-je configurer supervisord pour ne pas intercepter les stdout / stderr d'un processus (ou pour capturer dans un fichier journal mais aussi pour transférer vers les stdout / stderr normaux).

Ce que j'ai déjà essayé :

  1. stdout_logfile=NONE - Ne pas obtenir de logs ni stdout ni dans un fichier
  2. stdout_logfile=/var/log/supervisor/%(program_name)s.log - Obtenir les journaux dans un fichier mais pas dans la sortie standard.
  3. Ne pas définir stdout_logfile - Récupère les journaux dans un fichier nommé au hasard mais pas dans la sortie standard.
  4. stdout_logfile=/dev/stdout - Supervisord donne une erreur :

    CRIT exception Python non capturée, fermeture du canal (stdout)> ( :[Errno 29] Recherche illégale [/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])

10voto

Andreas Veithen Points 376

El Illegal seek L'erreur est causée par le code dans supervisord qui est responsable de la rotation du fichier journal. Pour rediriger vers stdout/stderr, vous devez désactiver la rotation des fichiers journaux, comme expliqué ici :

http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html

0 votes

Merci beaucoup, en utilisant stdout_logfile=/dev/stdout ainsi que stdout_logfile_maxbytes=0 a résolu mon problème.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X