Enregistrement / débogage facile des applications avec nginx, uwsgi, flask?

Je ne cherche pas à activer la console de débogage dangereuse , mais mon application reçoit une erreur 500 et ne semble pas avoir écrit de résultat pour que je puisse étudier plus en profondeur.

J’ai vu cet échange sur la liste de diffusion , ce qui m’a amené à cette page sur les erreurs de journalisation .

Cependant, je trouve toujours cela très déroutant et j’ai quelques questions:

(1) Dans quel fichier les éléments ci-dessous doivent-ils aller?

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) 

… en supposant que le modèle de fichier “devient plus gros” pour les applications plus grandes? __init__.py ? config.py ? run.py ?

(2) Je suis dépassé par les options là-bas et je ne peux pas dire ce que je devrais utiliser. Quels enregistreurs dois-je activer, avec quels parameters, pour répliquer le débogage du serveur python local que je reçois dans stdout lorsque je lance run.py? Je trouve ce stream de sortie local par défaut très utile, plus que le débogueur interactif de la page. Quelqu’un at-il un modèle à partager lors de la configuration de quelque chose qui reproduit ceci avec un déploiement nginx, en le faisant sortir dans un journal?

(3) Y a-t-il quelque chose que je dois changer, pas au niveau du flask, mais dans nginx, par exemple dans le fichier /etc/nginx/sites-available/appname , pour permettre la journalisation?

METTRE À JOUR

Plus précisément, je cherche des informations comme celles que je reçois lorsque Python s’exécute localement pour savoir pourquoi, par exemple, un paquet ne fonctionne pas, ou où mon erreur de syntaxe pourrait être, ou quelle variable n’existe pas:

 $ python run.py Traceback (most recent call last): File "run.py", line 1, in  from myappname import app File "/home/me/myappname/myappname/__init__.py", line 27, in  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 ssortingng: %r" % level) 

Lorsque je lance Flask sur un serveur, je ne le vois jamais. Je viens de recevoir une erreur uWSGI dans le navigateur et je n’ai aucune idée du code qui pose problème. Je voudrais juste que quelque chose comme ce qui précède soit écrit dans un fichier.

Je remarque également que la définition de la journalisation suivante n’a pas vraiment écrit beaucoup sur le fichier, même lorsque je mets le journal au niveau DEBUG:

 from logging import FileHandler file_handler = FileHandler('mylog.log') file_handler.setLevel(logging.DEBUG) app.logger.addHandler(file_handler) 

mylog.log est vide, même lorsque mon application est en erreur.

J’appendai aussi que j’ai essayé de définir debug = True de la manière suivante, dans __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) 

Dans mon fichier config.py, j’ai …

 debug = True Debug = True DEBUG = True 

Cependant, aucun débogage ne se produit, et sans connexion ou débogage, il est plutôt difficile de le retrouver. Les erreurs terminent simplement l’application avec le message de navigateur inutile:

 uWSGI Error Python application not found 

Définissez config['PROPAGATE_EXCEPTIONS'] sur True lorsque vous exécutez l’application en production et que vous souhaitez que les retraites soient consignées dans des fichiers journaux. (Je n’ai pas essayé avec le gestionnaire SMTP, cependant ..)

  1. La partie où vous créez des gestionnaires, ajoutez-les aux enregistreurs, etc. doit figurer dans la if __name__ == '__main__' , c’est-à-dire votre point d’entrée principal. Je suppose que ce serait run.py
  2. Je ne suis pas sûr de pouvoir répondre à cela – cela dépend de ce que vous voulez. Je vous conseille de regarder le tutoriel de journalisation pour voir les différentes options disponibles.
  3. Je ne crois pas que vous ayez besoin de changer quoi que ce soit au niveau nginx .

Mise à jour: vous pourriez vouloir avoir une clause d’exception qui couvre les exceptions non capturées, par exemple

 if __name__ == '__main__': try: app.run(debug=True) except Exception: app.logger.exception('Failed') 

qui devrait écrire la trace de toute exception survenue dans le app.run() dans le journal.

Je sais que c’est un message TRES ancien, mais je suis tombé sur le problème maintenant, et il m’a fallu un peu de temps pour trouver la solution. Flask envoie des erreurs au serveur. J’exécutais Gunicorn avec un script de démarrage sur Ubuntu 14.04 LTS, et l’endroit où j’ai trouvé les journaux d’erreur était le suivant:

/var/log/upstart/myapp.log

http://docs.gunicorn.org/en/stable/deploy.html#upstart

Juste au cas où une autre pauvre âme se retrouverait dans cette situation.