deploy - python django nginx uwsgi
Fácil registro de aplicaciones/depuración con nginx, uwsgi, matraz? (3)
- La parte donde crea manejadores, agregue a registradores, etc. debe estar en la cláusula
if __name__ == ''__main__''
, es decir, su punto de entrada principal. Supongo que seríarun.py
- No estoy seguro de poder responder a esto, depende de lo que quieras. Aconsejaría mirar el tutorial de registro para ver las diferentes opciones disponibles.
- No creo que necesites cambiar nada en el nivel
nginx
.
Actualización: es posible que desee tener una cláusula de excepción que cubra excepciones no detectadas, por ejemplo
if __name__ == ''__main__'':
try:
app.run(debug=True)
except Exception:
app.logger.exception(''Failed'')
que debe escribir el rastreo de cualquier excepción que se haya producido en app.run()
en el registro.
No estoy buscando activar la peligrosa consola de depuración , pero mi aplicación está recibiendo un error de 500 y no parece estar escribiendo ningún resultado para que investigue más a fondo.
Vi este intercambio en la lista de correo , que me llevó a esta página sobre errores de registro .
Sin embargo, todavía encuentro esto muy confuso y tengo un par de preguntas:
(1) ¿En qué archivo debe ir el material a continuación?
ADMINS = [''[email protected]'']
if not app.debug:
import logging
from logging.handlers import SMTPHandler
mail_handler = SMTPHandler(''127.0.0.1'',
''[email protected]'',
ADMINS, ''YourApplication Failed'')
mail_handler.setLevel(logging.ERROR)
app.logger.addHandler(mail_handler)
... ¿asumiendo el patrón de archivo "cada vez más grande" para aplicaciones más grandes? __init__.py
? config.py
? run.py
?
(2) Estoy abrumado por las opciones allí, y no puedo decir cuál debo usar. ¿Qué registradores debo activar, con qué configuración, para replicar la depuración del servidor local de python, obtengo stdout cuando ejecuto run.py? Encuentro que la secuencia de salida local predeterminada es muy útil, más que el depurador interactivo en la página. ¿Alguien tiene un patrón que podrían compartir al configurar algo que replica esto con una implementación de nginx, generando un registro?
(3) ¿Hay algo que necesite cambiar, no en el nivel del matraz, sino en nginx, por ejemplo en mi /etc/nginx/sites-available/appname
, para habilitar el registro?
ACTUALIZAR
Específicamente, estoy buscando información como la que obtengo cuando Python se ejecuta localmente sobre por qué, por ejemplo, un paquete no funciona, o dónde podría estar mi error de sintaxis, o qué variable no existe:
$ python run.py
Traceback (most recent call last):
File "run.py", line 1, in <module>
from myappname import app
File "/home/me/myappname/myappname/__init__.py", line 27, in <module>
file_handler.setLevel(logging.debug)
File "/usr/lib/python2.7/logging/__init__.py", line 710, in setLevel
self.level = _checkLevel(level)
File "/usr/lib/python2.7/logging/__init__.py", line 190, in _checkLevel
raise TypeError("Level not an integer or a valid string: %r" % level)
Cuando ejecuto el matraz en un servidor, nunca veo esto. Acabo de recibir un error uWSGI en el navegador y no tengo idea de qué código fue problemático. Me gustaría que algo así se escriba en un archivo.
También me doy cuenta de que establecer el siguiente registro realmente no escribía mucho al archivo, incluso cuando cambio el registro al nivel de DEPURACIÓN:
from logging import FileHandler
file_handler = FileHandler(''mylog.log'')
file_handler.setLevel(logging.DEBUG)
app.logger.addHandler(file_handler)
mylog.log
está en blanco, incluso cuando mi aplicación se equivoca.
También agregaré que he intentado configurar debug = True de las siguientes maneras, en __init__.py
:
app = Flask(__name__)
app.debug = True
app.config[''DEBUG''] = True
from werkzeug.debug import DebuggedApplication
app.wsgi_app = DebuggedApplication(app.wsgi_app, True)
app.config.from_object(''config'')
app.config.update(DEBUG=True)
app.config[''DEBUG''] = True
if __name__ == ''__main__'':
app.run(debug=True)
Mientras estoy en mi archivo config.py, tengo ...
debug = True
Debug = True
DEBUG = True
Sin embargo, no se produce ninguna depuración, y sin el registro o la depuración, es bastante difícil de rastrear. Los errores simplemente finalizan la aplicación con el mensaje del navegador no útil:
uWSGI Error
Python application not found
Establezca config[''PROPAGATE_EXCEPTIONS'']
en True
cuando ejecuta la aplicación en producción y desea que los registros se inicien en los archivos de registro. (No he probado con el controlador SMTP, sin embargo ..)
Sé que esta es una publicación MUY antigua, pero me encontré con el problema ahora, y me llevó un poco encontrar la solución. Flask envía errores al servidor. Estaba ejecutando Gunicorn con un script upstart en Ubuntu 14.04 LTS, y el lugar donde encontré los registros de errores fue el siguiente:
/var/log/upstart/myapp.log
http://docs.gunicorn.org/en/stable/deploy.html#upstart
Solo en caso de que algún otro pobre alma termine en esta situación.