Désactiver les messages de la console dans le serveur Flask

90

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é?

ATOzTOA
la source
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:

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()
Drewes
la source
9
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

from flask import Flask
import logging

app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
iamtodor
la source
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.

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é.

Tom Wojcik
la source
8

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)
Suis-je
la source
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

grâce à:

daicoden
la source
7

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().

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 ERRORet le remplacement des méthodes de clic avec des fonctions vides, toute sortie de journal sans erreur doit être empêchée.

Brendan Burkhart
la source
6

Pour supprimer Serving Flask app ...:

os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()
Slava V
la source
1
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

progyammer
la source
-1

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

État profond de déni
la source
-3

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

Anton Erjomin
la source