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 détaillé?
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 détaillé?
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()
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 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é.
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 à:
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çant click.echo
et click.secho
j'ai éliminé le message de démarrage de Flask 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 __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.
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: /
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
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