Alors maintenant, vous avez une application qui lance les threads (qui sont assez difficiles à déboguer eux-mêmes) et maintenant vous allez supprimer la journalisation en plus de cela? Eesh, sonne comme le contraire de ce que je ferais. Plus votre journalisation est verbeuse, mieux c'est (évidemment tant que c'est pertinent;)).
Demian Brecht
6
@DemianBrecht Le fait est que les journaux sont envoyés, stderrmais ils ne font que consigner chaque transaction HTTP, un peu sans importance pour moi ...
ATOzTOA
Réponses:
131
Vous pouvez régler le niveau de l'enregistreur Werkzeug sur ERROR, dans ce cas, seules les erreurs sont enregistrées:
Cela ne semble pas empêcher les journaux HTTP d'aller vers stderr; Il ne s'arrête le « démarrage » message (qui a clairement le nom du module « Werkzeug » dans le format du journal ».
RSB
2
Travaille pour moi. Les messages de débogage de la demande sont supprimés. Utilisation de Python 3.5.2, Flask 0.12 et Werkzeug 0.11.11
JackLeEmmerdeur
3
Fonctionne également avec Python 3.6, Flask 0.12 et Werkzeug 0.11.15.
vallentin
8
Malheureusement, ne fonctionne plus complètement en raison de l'utilisation de Flaskclick.secho
Peter
1
Changer le niveau de journalisation ne devrait pas être la solution pour éviter de ne journaliser qu'une requête particulière.
gented le
11
Cette solution vous offre un moyen d'obtenir vos propres impressions et traces de pile, mais sans les journaux de niveau d'information du flask, 127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200
Cela fonctionne lors de l'exécution de mon serveur localement, mais étrangement sur Heroku, ce n'est pas le cas.
Garrett le
10
La solution @Drewes fonctionne la plupart du temps, mais dans certains cas, j'ai toujours tendance à obtenir des journaux werkzeug. Si vous ne voulez vraiment en voir aucun, je vous suggère de le désactiver comme ça.
C'est la seule solution qui a fonctionné pour moi, et j'utilise Flask avec WSGIServer
Woody
7
Une autre raison pour laquelle vous souhaiterez peut-être modifier la sortie de journalisation est pour les tests et rediriger les journaux du serveur vers un fichier journal.
Je n'ai pas non plus pu faire fonctionner la suggestion ci-dessus, il semble que les enregistreurs soient configurés dans le cadre du démarrage de l'application. J'ai pu le faire fonctionner en modifiant les niveaux de journal après le démarrage de l'application:
... (in setUpClass)
server = Thread(target=lambda: app.run(host=hostname, port=port, threaded=True))
server.daemon = True
server.start()
wait_for_boot(hostname, port) # curls a health check endpoint
log_names = ['werkzeug']
app_logs = map(lambda logname: logging.getLogger(logname), log_names)
file_handler = logging.FileHandler('log/app.test.log', 'w')
for app_log in app_logs:
for hdlr in app_log.handlers[:]: # remove all old handlers
app_log.removeHandler(hdlr)
app_log.addHandler(file_handler)
Malheureusement * Running on localhost:9151, le premier contrôle de santé est toujours imprimé en standard, mais lors de l'exécution de nombreux tests, il nettoie la sortie d'une tonne.
"Alors pourquoi log_names?", Demandez-vous. Dans mon cas, il y avait des journaux supplémentaires dont je devais me débarrasser. J'ai pu trouver les enregistreurs à ajouter à log_names via:
from flask import Flask
app = Flask(__name__)
import logging
print(logging.Logger.manager.loggerDict)
Note latérale: ce serait bien s'il y avait un flaskapp.getLogger () ou quelque chose comme ça, donc c'était plus robuste entre les versions. Des idées?
Quelques mots clés supplémentaires: le journal de test du flacon supprime la sortie stdout
Aucune des autres réponses n'a fonctionné correctement pour moi, mais j'ai trouvé une solution basée sur le commentaire de Peter . Flask ne l'utilise apparemment plus loggingpour la journalisation et est passé au package Click . En remplaçant click.echoet click.sechoj'ai éliminé le message de démarrage de Flask app.run().
Entre la définition du niveau de journalisation sur ERRORet le remplacement des méthodes de clic avec des fonctions vides, toute sortie de journal sans erreur doit être empêchée.
Cela fonctionne pour moi, je l'ai utilisé lors du test de l'application flask (en utilisant nose2) cela supprime l'encombrement dans le terminal. Merci
CpK
6
Réponse tardive mais j'ai trouvé un moyen de supprimer CHAQUE MESSAGE DE LA CONSOLE (y compris ceux affichés lors d'une abort(...)erreur).
import os
import logging
logging.getLogger('werkzeug').disabled = True
os.environ['WERKZEUG_RUN_MAIN'] = 'true'
Il s'agit essentiellement d'une combinaison des réponses données par Slava V et Tom Wojcik
Un moyen de le faire par force brute si vous ne voulez vraiment rien se connecter à la console à côté des instructions print () est de logging.basicConfig(level=logging.FATAL). Cela désactiverait tous les journaux dont l'état est fatal. Cela ne désactiverait pas l'impression mais oui, juste une pensée: /
Le premier point: selon la documentation officielle de Flask, vous ne devriez pas exécuter l'application Flask en utilisant app.run (). La meilleure solution consiste à utiliser uwsgi, vous pouvez donc désactiver les journaux de flask par défaut en utilisant la commande "--disable-logging"
stderr
mais ils ne font que consigner chaque transaction HTTP, un peu sans importance pour moi ...Réponses:
Vous pouvez régler le niveau de l'enregistreur Werkzeug sur ERROR, dans ce cas, seules les erreurs sont enregistrées:
import logging log = logging.getLogger('werkzeug') log.setLevel(logging.ERROR)
Voici un exemple entièrement fonctionnel testé sur OSX, Python 2.7.5, Flask 0.10.0:
from flask import Flask app = Flask(__name__) import logging log = logging.getLogger('werkzeug') log.setLevel(logging.ERROR) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
la source
click.secho
Cette solution vous offre un moyen d'obtenir vos propres impressions et traces de pile, mais sans les journaux de niveau d'information du flask,
127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200
from flask import Flask import logging app = Flask(__name__) log = logging.getLogger('werkzeug') log.disabled = True
la source
La solution @Drewes fonctionne la plupart du temps, mais dans certains cas, j'ai toujours tendance à obtenir des journaux werkzeug. Si vous ne voulez vraiment en voir aucun, je vous suggère de le désactiver comme ça.
from flask import Flask import logging app = Flask(__name__) log = logging.getLogger('werkzeug') log.disabled = True app.logger.disabled = True
Pour moi, il a échoué quand il a
abort(500)
été élevé.la source
Si vous utilisez le serveur WSGI, définissez le journal sur Aucun
gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)
la source
Une autre raison pour laquelle vous souhaiterez peut-être modifier la sortie de journalisation est pour les tests et rediriger les journaux du serveur vers un fichier journal.
Je n'ai pas non plus pu faire fonctionner la suggestion ci-dessus, il semble que les enregistreurs soient configurés dans le cadre du démarrage de l'application. J'ai pu le faire fonctionner en modifiant les niveaux de journal après le démarrage de l'application:
... (in setUpClass) server = Thread(target=lambda: app.run(host=hostname, port=port, threaded=True)) server.daemon = True server.start() wait_for_boot(hostname, port) # curls a health check endpoint log_names = ['werkzeug'] app_logs = map(lambda logname: logging.getLogger(logname), log_names) file_handler = logging.FileHandler('log/app.test.log', 'w') for app_log in app_logs: for hdlr in app_log.handlers[:]: # remove all old handlers app_log.removeHandler(hdlr) app_log.addHandler(file_handler)
Malheureusement
* Running on localhost:9151
, le premier contrôle de santé est toujours imprimé en standard, mais lors de l'exécution de nombreux tests, il nettoie la sortie d'une tonne."Alors pourquoi
log_names
?", Demandez-vous. Dans mon cas, il y avait des journaux supplémentaires dont je devais me débarrasser. J'ai pu trouver les enregistreurs à ajouter à log_names via:from flask import Flask app = Flask(__name__) import logging print(logging.Logger.manager.loggerDict)
Note latérale: ce serait bien s'il y avait un flaskapp.getLogger () ou quelque chose comme ça, donc c'était plus robuste entre les versions. Des idées?
Quelques mots clés supplémentaires: le journal de test du flacon supprime la sortie stdout
grâce à:
la source
Aucune des autres réponses n'a fonctionné correctement pour moi, mais j'ai trouvé une solution basée sur le commentaire de Peter . Flask ne l'utilise apparemment plus
logging
pour la journalisation et est passé au package Click . En remplaçantclick.echo
etclick.secho
j'ai éliminé le message de démarrage de Flaskapp.run()
.import logging import click from flask import Flask app = Flask(__name__) log = logging.getLogger('werkzeug') log.setLevel(logging.ERROR) def secho(text, file=None, nl=None, err=None, color=None, **styles): pass def echo(text, file=None, nl=None, err=None, color=None, **styles): pass click.echo = echo click.secho = secho @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
Entre la définition du niveau de journalisation sur
ERROR
et le remplacement des méthodes de clic avec des fonctions vides, toute sortie de journal sans erreur doit être empêchée.la source
Pour supprimer
Serving Flask app ...
:os.environ['WERKZEUG_RUN_MAIN'] = 'true' app.run()
la source
Réponse tardive mais j'ai trouvé un moyen de supprimer CHAQUE MESSAGE DE LA CONSOLE (y compris ceux affichés lors d'une
abort(...)
erreur).import os import logging logging.getLogger('werkzeug').disabled = True os.environ['WERKZEUG_RUN_MAIN'] = 'true'
Il s'agit essentiellement d'une combinaison des réponses données par Slava V et Tom Wojcik
la source
Un moyen de le faire par force brute si vous ne voulez vraiment rien se connecter à la console à côté des instructions print () est de
logging.basicConfig(level=logging.FATAL)
. Cela désactiverait tous les journaux dont l'état est fatal. Cela ne désactiverait pas l'impression mais oui, juste une pensée: /EDIT: J'ai réalisé que ce serait égoïste de ma part de ne pas mettre de lien vers la documentation que j'ai utilisée :) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial
la source
Le premier point: selon la documentation officielle de Flask, vous ne devriez pas exécuter l'application Flask en utilisant app.run (). La meilleure solution consiste à utiliser uwsgi, vous pouvez donc désactiver les journaux de flask par défaut en utilisant la commande "--disable-logging"
Par exemple:
uwsgi --socket 0.0.0.0:8001 --disable-logging --protocol=http -w app:app
la source