Flask sunucusunda konsol mesajlarını devre dışı bırakın


91

Bağımsız modda (kullanarak app.run()) çalışan bir Flask sunucum var . Ama konsolda herhangi bir mesaj istemiyorum.

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

Ayrıntılı modu nasıl devre dışı bırakırım?


Yani şimdi (yeterince zor kendilerini hata ayıklamak için vardır) konuları bir uygulamayı başlıyor ve şimdi size bastırmak günlük gidiyoruz üst bunun? Eesh, kulağa yaptığım şeyin tam tersi gibi geliyor .. Günlük kaydı ne kadar ayrıntılı olursa o kadar iyi (tabii ki alakalı olduğu sürece;)).
Demian Brecht

7
@DemianBrecht Mesele şu ki, günlükler gönderiliyor stderrama onlar sadece her HTTP işlemini günlüğe
kaydediyorlar

Yanıtlar:


134

Werkzeug günlük kaydedicisinin düzeyini ERROR olarak ayarlayabilirsiniz, bu durumda yalnızca hatalar günlüğe kaydedilir:

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

İşte OSX, Python 2.7.5, Flask 0.10.0 üzerinde test edilmiş tam olarak çalışan bir örnek:

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
Bu, HTTP günlüklerinin stderr'e gitmesini durdurmuyor gibi görünüyor; "Başlangıç" mesajını durdurur (günlük formatında "werkzeug" modül adına açıkça sahiptir ".
rsb

2
Benim için çalışıyor. İstek hata ayıklama mesajları bastırılır. Python 3.5.2, Flask 0.12 ve Werkzeug 0.11.11 kullanarak
JackLeEmmerdeur

3
Ayrıca Python 3.6, Flask 0.12 ve Werkzeug 0.11.15 ile çalışır.
vallentin

8
Ne yazık ki artık Flask kullandığı için tam olarak çalışmıyorclick.secho
Peter

1
Günlüğe kaydetme düzeyini değiştirmek, yalnızca belirli bir isteği günlüğe kaydetmekten kaçınmak için çözüm olmamalıdır.
2019

13

Bu çözüm, kendi baskılarınızı ve yığın izlerinizi almanın bir yolunu sağlar, ancak flask suck'tan bilgi seviyesi günlükleri 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

Bu, sunucumu yerel olarak çalıştırırken işe yarıyor, ancak tuhaf bir şekilde Heroku'da çalışmıyor.
Garrett

10

@Drewes çözümü çoğu zaman işe yarıyor, ancak bazı durumlarda hala werkzeug günlükleri alma eğilimindeyim. Hiçbirini gerçekten görmek istemiyorsanız, bu şekilde devre dışı bırakmanızı öneririm.

from flask import Flask
import logging

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

Benim için abort(500)büyüdüğünde başarısız oldu.


9

WSGI sunucusu kullanıyorsanız, lütfen günlüğü Yok olarak ayarlayın

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

Bu benim için işe yarayan tek çözümdü ve Flask'ı WSGIServer ile kullanıyorum
Woody

8

Diğer cevapların hiçbiri benim için doğru çalışmadı, ancak Peter'ın yorumuna dayanarak bir çözüm buldum . Görünüşe göre Flask artık logginggünlük kaydı için kullanmıyor ve tıklama paketine geçti. Geçersiz kılarak click.echove click.sechoFlask'ın başlangıç ​​mesajını elimden aldım 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()

Günlük kaydı düzeyinin ayarlanması ve ERRORboş işlevlere sahip tıklama yöntemlerinin geçersiz kılınması arasında, tüm hatasız günlük çıktısı önlenmelidir.


7

Günlük çıktısını değiştirmek istemenizin bir başka nedeni de testler içindir ve sunucu günlüklerini bir günlük dosyasına yeniden yönlendirmektir.

Ben de çalışmak için yukarıdaki öneriyi alamadım, görünüşe göre kaydediciler uygulamanın başlamasının bir parçası olarak kuruluyor. Uygulamayı başlattıktan sonra günlük seviyelerini değiştirerek çalıştırmayı başardım :

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

Ne yazık ki * Running on localhost:9151ve ilk sağlık kontrolü hala standart olarak yazdırılıyor, ancak çok sayıda test çalıştırıldığında çıktıyı bir ton temizliyor.

"Öyleyse neden log_names?" Diye soruyorsunuz. Benim durumumda, kurtulmam gereken bazı ekstra günlükler vardı. Log_names'e hangi kaydedicilerin ekleneceğini şu yolla bulabildim:

from flask import Flask
app = Flask(__name__)

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

Yan not: Bir flaskapp.getLogger () veya başka bir şey olsaydı iyi olurdu, bu yüzden bu sürümler arasında daha sağlamdı. Herhangi bir fikir?

Birkaç anahtar kelime daha: şişe test günlüğü standart çıktıyı kaldır

sayesinde:


6

Bastırmak için Serving Flask app ...:

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

1
Bu benim için çalışıyor, balon uygulamasını test ederken kullandım (burun2 kullanarak) bu, terminaldeki dağınıklığı ortadan kaldırır. Teşekkürler
CpK

6

Geç cevap ama HER KONSOL MESAJINI (bir abort(...)hata sırasında görüntülenenler dahil) bastırmanın bir yolunu buldum .

import os
import logging

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

Bu temelde Slava V ve Tom Wojcik tarafından verilen cevapların bir kombinasyonudur.


-1

Konsolda print () ifadelerinin yanı sıra herhangi bir şeyin oturum açmasını gerçekten istemiyorsanız bunu yapmanın bir kaba kuvvet yolu yapmaktır logging.basicConfig(level=logging.FATAL). Bu, ölümcül durumda olan tüm günlükleri devre dışı bırakır. Yazdırmayı devre dışı bırakmaz ama evet, sadece bir düşünce: /

DÜZENLEME: Kullandığım belgelere bağlantı vermemenin bencilce olacağını fark ettim :) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial


-3

İlk nokta: Resmi Flask belgelerine göre, app.run () kullanarak Flask uygulamasını çalıştırmamalısınız. En iyi çözüm uwsgi kullanmaktır, böylece "--disable-logging" komutunu kullanarak varsayılan flask günlüklerini devre dışı bırakabilirsiniz.

Örneğin:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.