web-dev-qa-db-fra.com

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

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?

58
ATOzTOA

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()
91
Drewes

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 à:

6
daicoden

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

5
Tom Wojcik

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

2
progyammer

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
2
mrmailperson

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.

1
Brendan Burkhart

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)
1
Amirutha Vardhan

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

0
Deep state of denial

Pour supprimer Serving Flask app ...:

os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()
0
Slava V

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

0
Anton Erjomin