¿Hay alguna manera de registrar declaraciones de impresión de Python en gunicorn?

3 minutos de lectura

avatar de usuario de kontur
contacto

Con mi Procfile así:

web: gunicorn app:app \
    --bind "$HOST:$PORT" \
    --error-logfile "-" \
    --enable-stdio-inheritance \
    --reload \
    --log-level "debug" 

¿Es de alguna manera posible obtener python? print declaraciones que se registrarán en stdout / bash? estoy usando el bottle marco aquí también, si eso afecta algo.

  • El indicador de depuración no se aplica a gunicorn. En realidad falla si intentas ejecutarlo: gunicorn: error: unrecognized arguments: --debug

    – Akronix

    25 de mayo de 2018 a las 11:11

  • @Akronix gracias, verificado en el documentos y tampoco puedo encontrar –debug; tal vez nunca fue compatible pero no causó un error, o se eliminó desde entonces. Lo eliminé de la pregunta, solo para que no haya incentivos para copiarlo.

    – Kontur

    8 de junio de 2022 a las 12:15

resulta que print las declaraciones en realidad estaban llegando, pero con retraso.

Él documentos de gunicorn para –enable-stdio-inheritance nota para establecer el PYTHONUNBUFFEREDque pensé que tenía, pero parece tener una sintaxis incorrecta.

Lo resolví usando un .env archivo con mi foreman configuración para establecer la variable de esta manera:

PYTHONUNBUFFERED=TRUE

  • Aunque es una forma oficial de hacerlo, no funciona por razones desconocidas (python 2.7)

    – FelikZ

    4 de noviembre de 2016 a las 11:55

En python 3, agregando flush=True en cada declaración de impresión funciona para mi aplicación de matraz/gunicorn.

P.ej

gunicorn --bind 0.0.0.0:8080 server --log-level debug

No se requieren banderas particulares.

A ver si esto ayuda.

  • No parece conveniente cambiar el código de la aplicación para evitar esto.

    – Kontur

    25 de septiembre de 2020 a las 6:41

  • agregar flush=True to print() también funcionó para mí con gunicorn

    – Jaycer

    20 de julio de 2022 a las 17:58

Avatar de usuario de Satys
Satys

Por favor intente debajo del comando:

gunicorn --workers 3 --bind 127.0.0.1:5000 --error-logfile /var/log/gunicorn/error.log --access-logfile /var/log/gunicorn/access.log --capture-output --log-level debug

Funcionó para mí.

  1. Especificar --log-level a debug(por defecto info).

  2. Especificar --capture-output indicador (falso por defecto).

Debería poder ver los registros en el archivo de registro de errores.

  • ¿No hay forma de crearlo automáticamente? FileNotFoundError: [Errno 2] No such file or directory: '/var/log/gunicorn/error.log'

    – Rami Alloush

    23 de diciembre de 2021 a las 21:15


  • ¿Hay alguna manera de redirigir todos los stdout y stderr a un archivo separado de lo que se especifica en --error-log?

    –Naven Reddy Marthala

    22 de enero de 2022 a las 8:19

Avatar de usuario de Rick
Almiar

Uso Python3 junto con Flask.

yo suelo print('log info') directamente en lugar de print('log info', flush=True).

yo solo configuro capture_output a True y establecer un errorlog archivo y funciona.

Nota eso:

capturar_salida

--capture-output
False

Redirigir stdout/stderr al archivo especificado en registro de errores

Creo que es que necesitas especificar un registro de errores archivo para obtener la salida estándar.


Aquí está mi archivo de configuración gunicorn.config.py entorno

accesslog = 'gunicorn.log'
errorlog = 'gunicorn.error.log'
capture_output = True

Entonces corre con gunicorn app_py:myapp -c gunicorn.config.py

La línea de comando equivalente sería

gunicorn app_py:myapp --error-logfile gunicorn.error.log --access-logfile gunicorn.log --capture-output

Esto está funcionando para mí (estoy usando un servicio llamado si-ct)

gunicorn --workers 3 --bind unix:si-ct.sock -m 007 wsgi:app --log-level debug --error-logfile - --access-logfile - --capture-output --reload 

Con eso, el print la salida se muestra en mis registros de servicio, que leo usando

sudo journalctl -u si-ct -f

¿Ha sido útil esta solución?