python - Docker, Supervisord y registro: ¿cómo consolidar los registros en los registros de la ventana acoplable?
django logging (6)
De hecho, iniciar Supervisión en modo no daemon es la mejor solución.
También puede usar volúmenes para montar los registros del supervisor en un lugar central.
Entonces, experimentando con la aplicación Docker + Supervisord + Django a través de uWSGI. Tengo toda la pila funcionando bien, pero necesito ordenar el registro.
Si lanzo supervisor en modo no daemon,
/usr/bin/supervisord -n
Luego obtengo la salida de registro para el supervisor reproducida en la salida estándar de los registros de la ventana acoplable. Sin embargo, si supervisord está en modo daemon, sus propios registros se guardan en el sistema de archivos contenedor, y los registros de sus aplicaciones también lo hacen, en sus propios archivos app__stderr / stdout.
Lo que quiero es registrar tanto el supervisor como la aplicación estándar en el registro de la ventana acoplable.
¿Es el inicio de Supervisión en modo no daemon una idea sensata para esto, o causa consecuencias no deseadas? Además, ¿cómo consigo que los registros de la aplicación también se reproduzcan en los registros de la ventana acoplable?
El contenedor Docker es como un kleenex, lo usas y luego lo sueltas. Para estar "vivo", Docker necesita algo que se ejecute en primer plano (mientras que los demonios se ejecutan en segundo plano), por eso está utilizando Supervisord.
Por lo tanto, debe "redirigir / agregar / fusionar" la salida del proceso (acceso y error) a la salida Supervisord que ve cuando ejecuta su contenedor.
Como dijo Drew, todos están utilizando https://github.com/coderanger/supervisor-stdout para lograrlo (para mí, esto debería agregarse al proyecto supervisor). Algo que Drew olvidó decir, es posible que necesites agregar
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
Al bloque de configuración del programa supervisor.
Algo muy útil también, imagine que su proceso está registrando un archivo de registro en lugar de una salida estándar, puede pedirle a supervisor que lo vea:
[program:php-fpm-log]
command=tail -f /var/log/php5-fpm.log
stdout_events_enabled=true
stderr_events_enabled=true
Esto redireccionará el contenido de php5-fpm.log a la salida estándar y luego a la salida estándar del supervisor a través de la salida estándar del supervisor.
Estoy de acuerdo, no usar el modo daemon parece la mejor solución, pero probablemente emplearía la misma estrategia que usaría cuando tuviera servidores físicos reales o algún tipo de configuración de VM: centralizar el registro.
Puede usar algo alojado logstash como logstash dentro del contenedor para recopilar registros y enviarlo a un servidor central. O use un servicio comercial como loggly o papertrail para hacer lo mismo.
La mejor práctica de hoy es tener imágenes mínimas de Docker. Para mí, el contenedor ideal con la aplicación Python contiene solo mi código, bibliotecas compatibles y algo así como uwsgi
si es necesario.
Publiqué una solución en https://github.com/msgre/uwsgi_logging . Es una aplicación Django simple detrás de uwsgi
que está configurada para mostrar los registros de uwsgi
y la aplicación Django en contenedores stdout sin necesidad de supervisor
.
Logré esto usando.
Instale supervisor-stdout en su imagen de Docker:
RUN apt-get install -y python-pip && pip install supervisor-stdout
Configuración de Supervisor
Edite su supervisord.conf
como se ve:
[program:myprogram]
command=/what/ever/command
stdout_events_enabled=true
stderr_events_enabled=true
[eventlistener:stdout]
command = supervisor_stdout
buffer_size = 100
events = PROCESS_LOG
result_handler = supervisor_stdout:event_handler
supervisor-stdout requiere la instalación de python-pip, que descarga ~ 150 mb, para un contenedor, creo que es mucho solo para instalar otra herramienta.
Redirigir el archivo de registro a / dev / stdout funciona para mí:
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html