python django logging supervisord docker

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