Disabilita i messaggi della console nel server Flask


91

Ho un server Flask in esecuzione in modalità standalone (utilizzando app.run()). Ma non voglio nessun messaggio nella console, come

127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...

Come si disabilita la modalità dettagliata?


Quindi ora hai un'app che avvia i thread (che sono abbastanza difficili da eseguire il debug da soli) e ora sopprimerai la registrazione per di più ? Eesh, suona come l'opposto di quello che farei io .. Più verboso è il tuo log, meglio è (ovviamente fintanto che è rilevante;)).
Demian Brecht

7
@DemianBrecht Il fatto è che i log vengono inviati a stderrma stanno solo registrando ogni transazione HTTP, un po 'irrilevante per me ...
ATOzTOA

Risposte:


133

È possibile impostare il livello del logger Werkzeug su ERROR, in tal caso vengono registrati solo gli errori:

import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)

Ecco un esempio completamente funzionante testato su 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()

9
Questo non sembra impedire ai log HTTP di andare su stderr; Ferma il messaggio di "avvio" (che ha chiaramente il nome del modulo "werkzeug" nel formato di registro ".
rsb

2
Per me va bene. I messaggi di debug di richiesta vengono soppressi. Usando Python 3.5.2, Flask 0.12 e Werkzeug 0.11.11
JackLeEmmerdeur

3
Funziona anche con Python 3.6, Flask 0.12 e Werkzeug 0.11.15.
vallentin

8
Sfortunatamente non funziona più completamente a causa dell'utilizzo di Flaskclick.secho
Peter

1
La modifica del livello di registrazione non dovrebbe essere la soluzione per evitare di registrare solo una particolare richiesta.
gented

13

Questa soluzione fornisce un modo per ottenere le proprie stampe e tracce di stack, ma senza che i log a livello di informazioni da flask suck as 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

Funziona quando si esegue il mio server in locale, ma stranamente su Heroku, non è così.
Garrett

10

La soluzione @Drewes funziona la maggior parte del tempo, ma in alcuni casi tendo comunque a ricevere i log di werkzeug. Se davvero non vuoi vederne nessuno, ti suggerisco di disabilitarlo in questo modo.

from flask import Flask
import logging

app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
app.logger.disabled = True

Per me ha fallito quando è abort(500)stato sollevato.


9

Nel caso in cui si utilizzi il server WSGI, impostare il registro su Nessuno

gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)

Questa è l'unica soluzione che ha funzionato per me e utilizzo Flask con WSGIServer
Woody

8

Nessuna delle altre risposte ha funzionato correttamente per me, ma ho trovato una soluzione basata sul commento di Peter . Apparentemente Flask non utilizza più loggingper la registrazione ed è passato al pacchetto click . Ignorando click.echoe click.sechoho eliminato il messaggio di avvio di Flask da 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()

Tra l'impostazione del livello di registrazione ERRORe l'override dei metodi di clic con funzioni vuote, dovrebbe essere impedito qualsiasi output di registro senza errori.


7

Un altro motivo per cui potresti voler modificare l'output di registrazione è per i test e reindirizzare i registri del server in un file di registro.

Non sono riuscito a far funzionare nemmeno il suggerimento sopra, sembra che i logger siano stati configurati come parte dell'avvio dell'app. Sono stato in grado di farlo funzionare modificando i livelli di registro dopo aver avviato l'app:

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

Purtroppo il * Running on localhost:9151 e il primo controllo di integrità sono ancora stampati come standard, ma quando si eseguono molti test pulisce l'output di un sacco.

"Allora perché log_names?", Chiedi. Nel mio caso c'erano alcuni registri extra di cui dovevo sbarazzarmi. Sono stato in grado di trovare quali logger aggiungere a log_names tramite:

from flask import Flask
app = Flask(__name__)

import logging
print(logging.Logger.manager.loggerDict)

Nota a margine: sarebbe bello se ci fosse un flaskapp.getLogger () o qualcosa del genere in modo che fosse più robusto tra le versioni. Qualche idea?

Ancora qualche parola chiave: il log di test del flask rimuove l'output di stdout

grazie a:


6

Per sopprimere Serving Flask app ...:

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

1
Questo funziona per me, l'ho usato durante il test dell'applicazione flask (usando nose2) questo rimuove il disordine nel terminale. Grazie
CpK

6

Risposta tardiva ma ho trovato un modo per sopprimere OGNI E OGNI MESSAGGIO DELLA CONSOLE (compresi quelli visualizzati durante un abort(...)errore).

import os
import logging

logging.getLogger('werkzeug').disabled = True
os.environ['WERKZEUG_RUN_MAIN'] = 'true'

Questa è fondamentalmente una combinazione delle risposte fornite da Slava V e Tom Wojcik


-1

Un modo brute force per farlo se davvero non vuoi che qualcosa acceda alla console oltre alle istruzioni print () è quello di logging.basicConfig(level=logging.FATAL). Ciò disabiliterà tutti i registri con stato fatale. Non disabiliterebbe la stampa ma sì, solo un pensiero: /

EDIT: Mi sono reso conto che sarebbe stato egoista da parte mia non mettere un collegamento alla documentazione che ho usato :) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial


-3

Il primo punto: secondo la documentazione ufficiale di Flask, non dovresti eseguire l'applicazione Flask usando app.run (). La soluzione migliore è usare uwsgi, quindi puoi disabilitare i log di flask predefiniti usando il comando "--disable-logging"

Per esempio:

uwsgi --socket 0.0.0.0:8001 --disable-logging --protocol=http -w app:app

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.