J'ai un serveur Flask fonctionnant en mode autonome (en utilisant app.run()
). Mais, je ne veux pas de messages dans la console, comme
127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...
Comment désactiver le mode verbose?
Vous pouvez définir le niveau défini du consignateur 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 complet de testet sous 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 __== "__main__":
app.run()
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 ne pouvais pas obtenir la suggestion ci-dessus à travailler non plus, il semble que les enregistreurs sont configurés dans le cadre de l'application à partir. J'ai pu le faire fonctionner en modifiant les niveaux de journalisation après en démarrant 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, le * Running on localhost:9151
et le premier bilan de santé sont toujours imprimés au format standard, mais lors de l'exécution de nombreux tests, il nettoie la sortie une tonne.
"Alors pourquoi log_names
?", Demandez-vous. Dans mon cas, je devais me débarrasser de quelques journaux supplémentaires. 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 autres mots clés: flask test log remove stdout output
grâce à:
La solution @Drewes fonctionne la plupart du temps, mais dans certains cas, j'ai toujours tendance à obtenir des journaux de travail Si vous ne voulez vraiment pas en voir, 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, cela a échoué lorsque abort(500)
a été activé.
Réponse tardive mais j'ai trouvé un moyen de supprimer CHACUN DES MESSAGES DE LA CONSOLE (y compris ceux affichés lors d'une erreur abort(...)
.).
import os
import logging
logging.getLogger('werkzeug').disabled = True
os.environ['WERKZEUG_RUN_MAIN'] = 'true'
Ceci est essentiellement une combinaison des réponses données par Slava V et Tom Wojcik
Cette solution vous permet d'obtenir vos propres traces d'impression et de pile, mais sans les journaux de niveau d'information du flacon, sucer comme 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
Aucune des autres réponses n'a fonctionné correctement pour moi, mais j'ai trouvé une solution basée sur commentaire de Peter . Flask n'utilise apparemment plus logging
pour la journalisation et est passé au package click . En remplaçant click.echo
et click.secho
, j'ai éliminé le message de démarrage de Flask de app.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 __== "__main__":
app.run()
Entre le réglage du niveau de consignation sur ERROR
et le remplacement des méthodes de clic par des fonctions vides, toute sortie du journal sans erreur doit être empêchée.
Si vous utilisez un serveur WSGI, définissez le journal sur Aucun.
gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)
Un moyen brute force de le faire si vous ne voulez vraiment rien connecter à la console à côté des instructions print () est de logging.basicConfig(level=logging.FATAL)
. Cela désactiverait tous les journaux ayant le statut fatal. Cela ne désactiverait pas l'impression mais oui, juste une pensée: /
EDIT: J'ai compris qu'il 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- tutoriel de base
Pour supprimer Serving Flask app ...
:
os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()
Premier point: conformément à la documentation officielle Flask, vous ne devez pas exécuter l’application Flask à l’aide de app.run (). La meilleure solution consiste à utiliser uwsgi. Vous pouvez donc désactiver les journaux par défaut flask à l'aide de la commande "--disable-logging".
Par exemple:
uwsgi --socket 0.0.0.0:8001 --disable-logging --protocol=http -w app:app