Nonaktifkan pesan konsol di server Flask

90

Saya memiliki server Flask yang berjalan dalam mode standalone (menggunakan app.run()). Tapi, saya tidak ingin ada pesan di konsol, seperti

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

Bagaimana cara menonaktifkan mode verbose?

ATOzTOA
sumber
Jadi sekarang Anda memiliki aplikasi yang memulai utas (yang cukup sulit untuk men-debug sendiri) dan sekarang Anda akan menekan logging di atas itu? Eesh, kedengarannya kebalikan dari apa yang akan saya lakukan .. Semakin verbose logging Anda semakin baik (jelas selama itu relevan;)).
Demian Brecht
6
@DemianBrecht Masalahnya, log dikirim ke stderrtetapi mereka hanya mencatat setiap transaksi HTTP, agak tidak relevan bagi saya ...
ATOzTOA

Jawaban:

132

Anda dapat mengatur level logger Werkzeug ke ERROR, dalam hal ini hanya kesalahan yang dicatat:

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

Berikut adalah contoh yang berfungsi penuh diuji pada 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
sumber
9
Ini sepertinya tidak menghentikan log HTTP menuju stderr; Ini TIDAK menghentikan pesan "mulai" (yang jelas memiliki nama modul "werkzeug" dalam format log ".
rsb
2
Bekerja untuk saya. Pesan debug permintaan ditekan. Menggunakan Python 3.5.2, Flask 0.12 dan Werkzeug 0.11.11
JackLeEmmerdeur
3
Juga bekerja menggunakan Python 3.6, Flask 0.12 dan Werkzeug 0.11.15.
Vallentin
8
Sayangnya tidak lagi berfungsi sepenuhnya karena Flask menggunakanclick.secho
Peter
1
Mengubah tingkat pencatatan seharusnya tidak menjadi solusi untuk menghindari pencatatan satu permintaan tertentu saja.
tuan
11

Solusi ini memberi Anda cara untuk mendapatkan cetakan Anda sendiri dan jejak tumpukan tetapi tanpa log tingkat informasi dari 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
iamtodor
sumber
Ini berfungsi saat menjalankan server saya secara lokal, tetapi anehnya di Heroku, ternyata tidak.
Garrett
10

Solusi @Drewes bekerja sebagian besar waktu, tetapi dalam beberapa kasus, saya masih cenderung mendapatkan log werkzeug. Jika Anda benar-benar tidak ingin melihat salah satu dari mereka, saya sarankan Anda menonaktifkannya seperti itu.

from flask import Flask
import logging

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

Bagi saya gagal saat abort(500)dibesarkan.

Tom Wojcik
sumber
8

Jika Anda menggunakan server WSGI, setel log ke Tidak Ada

gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)
Ami
sumber
Ini adalah satu-satunya solusi yang berhasil untuk saya, dan saya menggunakan Flask dengan WSGIServer
Woody
7

Alasan lain Anda mungkin ingin mengubah keluaran logging adalah untuk pengujian, dan mengarahkan log server ke file log.

Saya juga tidak bisa mendapatkan saran di atas untuk berfungsi, sepertinya logger disiapkan sebagai bagian dari permulaan aplikasi. Saya bisa membuatnya berfungsi dengan mengubah level log setelah memulai aplikasi:

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

Sayangnya * Running on localhost:9151pemeriksaan kesehatan dan pertama masih dicetak ke standar, tetapi ketika menjalankan banyak pengujian, itu membersihkan output satu ton.

"Jadi kenapa log_names?", Anda bertanya. Dalam kasus saya, ada beberapa log tambahan yang perlu saya singkirkan. Saya dapat menemukan penebang mana yang akan ditambahkan ke log_names melalui:

from flask import Flask
app = Flask(__name__)

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

Catatan tambahan: Akan lebih baik jika ada flaskapp.getLogger () atau sesuatu yang lebih kuat di semua versi. Ada ide?

Beberapa kata kunci lainnya: log uji flask menghapus keluaran stdout

terimakasih untuk:

daicoden.dll
sumber
7

Tidak ada jawaban lain yang berfungsi dengan benar untuk saya, tetapi saya menemukan solusi berdasarkan komentar Peter . Flask tampaknya tidak lagi digunakan logginguntuk logging, dan telah beralih ke paket klik . Dengan menimpa click.echodan click.sechomenghapus pesan startup Flask dari 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()

Antara menyetel tingkat pencatatan ke ERRORdan menimpa metode klik dengan fungsi kosong, semua keluaran log non-kesalahan harus dicegah.

Brendan Burkhart
sumber
6

Untuk menekan Serving Flask app ...:

os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()
Slava V
sumber
1
Ini berfungsi untuk saya, saya menggunakannya saat menguji aplikasi labu (menggunakan nose2) ini menghilangkan kekacauan di terminal. Terima kasih
CpK
6

Jawaban terlambat tetapi saya menemukan cara untuk menekan SETIAP DAN SETIAP PESAN KONSOL (termasuk yang ditampilkan selama abort(...)kesalahan).

import os
import logging

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

Ini pada dasarnya adalah kombinasi dari jawaban yang diberikan oleh Slava V dan Tom Wojcik

progyammer
sumber
-1

Cara brute force untuk melakukannya jika Anda benar-benar tidak ingin ada yang masuk ke konsol di samping pernyataan print () adalah dengan logging.basicConfig(level=logging.FATAL). Ini akan menonaktifkan semua log yang berstatus fatal. Itu tidak akan menonaktifkan pencetakan tapi ya, hanya sebuah pikiran: /

EDIT: Saya menyadari akan egois jika saya tidak memasang tautan ke dokumentasi yang saya gunakan :) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial

Keadaan penyangkalan yang dalam
sumber
-3

Poin pertama: Menurut dokumentasi resmi Flask, Anda sebaiknya tidak menjalankan aplikasi Flask menggunakan app.run (). Solusi terbaik adalah menggunakan uwsgi, jadi Anda dapat menonaktifkan log flask default menggunakan perintah "--disable-logging"

Sebagai contoh:

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

Anton Erjomin
sumber