फ्लास्क सर्वर में कंसोल संदेशों को अक्षम करें


90

मेरे पास एक फ्लास्क सर्वर है जो स्टैंडअलोन मोड (उपयोग app.run()) में चल रहा है । लेकिन, मुझे कंसोल में कोई संदेश नहीं चाहिए, जैसे

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

मैं वर्बोज़ मोड को कैसे निष्क्रिय करूँ?


तो अब आपके पास थ्रेड्स को किक करने वाला एक ऐप है (जो खुद को डीबग करना काफी मुश्किल है) और अब आप उसके ऊपर लॉगिंग को दबाने जा रहे हैं ? ईश, मुझे क्या करना है के विपरीत लगता है .. अधिक क्रिया आपके लॉगिंग बेहतर (जाहिर है जब तक यह प्रासंगिक है?))।
डेमियन ब्रेख्त

6
@DemianBrecht बात यह है, लॉग भेज रहे हैं, stderrलेकिन वे सिर्फ एक HTTP लेनदेन, मेरे लिए अप्रासंगिक लॉगिंग कर रहे हैं ...
ATOzTOA

जवाबों:


130

आप ERPOR को Werkzeug लकड़हारा का स्तर सेट कर सकते हैं, उस स्थिति में केवल त्रुटियाँ लॉग होती हैं:

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

यहाँ OSX, पायथन 2.7.5, फ्लास्क 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
ऐसा लगता नहीं है कि HTTP लॉग्स को स्टडर तक जाना बंद कर दिया गया है; यह "आरंभ" संदेश को रोक देता है (जिसमें लॉग प्रारूप में स्पष्ट रूप से "werkzeug" मॉड्यूल नाम है "
rsb

2
मेरे लिये कार्य करता है। अनुरोध डीबग संदेश सुपरिभाषित हैं। पायथन 3.5.2, फ्लास्क 0.12 और विर्केगेज 0.11.11 का उपयोग करना
जैकलेमेमरदेउर

3
इसके अलावा पायथन 3.6, फ्लास्क 0.12 और वर्कर्ज़ग 0.11.15 का उपयोग करके काम करता है।
vallentin

8
दुर्भाग्य से अब पूरी तरह से फ्लास्क के कारण काम नहीं करता हैclick.secho
पीटर

1
केवल एक विशेष अनुरोध को लॉग करने से बचने के लिए लॉगिंग के स्तर को बदलना समाधान नहीं होना चाहिए।
gented

11

यह समाधान आपको अपने स्वयं के प्रिंट और स्टैक के निशान प्राप्त करने का एक तरीका प्रदान करता है, लेकिन बिना सूचना स्तर लॉग के फ्लास्क चूसना के रूप में 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

यह मेरे सर्वर को स्थानीय रूप से चलाने पर काम करता है, लेकिन अजीब तरीके से हरोकू पर, यह नहीं है।
गैरेट

10

@ ड्र्यू सॉल्यूशन ज्यादातर समय काम करता है, लेकिन कुछ मामलों में, मैं अभी भी werkzeug लॉग प्राप्त करता हूं। यदि आप वास्तव में उनमें से किसी को भी नहीं देखना चाहते हैं, तो मैं आपको सुझाव देता हूं कि आप इसे उसी तरह अक्षम करें।

from flask import Flask
import logging

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

मेरे लिए यह तब विफल हो abort(500)गया जब मुझे उठाया गया था।


8

यदि आप WSGI सर्वर का उपयोग कर रहे हैं, तो कृपया लॉग को कोई नहीं पर सेट करें

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

यह एकमात्र समाधान है जो मेरे लिए काम करता है, और मैं 21-22 पर WSGIServer
वुडी

7

एक और कारण जो आप लॉगिंग आउटपुट को बदलना चाहते हैं वह परीक्षण के लिए है, और सर्वर लॉग को लॉग फ़ाइल में रीडायरेक्ट करता है।

मुझे या तो काम करने के लिए ऊपर सुझाव नहीं मिला, ऐसा लगता है कि ऐप शुरू करने के हिस्से के रूप में लकड़हारा सेटअप है। मैं ऐप को शुरू करने के बाद लॉग स्तरों को बदलकर इसे काम करने में सक्षम था :

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

दुर्भाग्य से * Running on localhost:9151 और पहली स्वास्थ्य जांच अभी भी मानक से बाहर मुद्रित की जाती है, लेकिन बहुत सारे परीक्षण चलाने पर यह एक टन उत्पादन को साफ करता है।

"तो क्यों log_names?", आप पूछते हैं। मेरे मामले में कुछ अतिरिक्त लॉग थे जिनसे मुझे छुटकारा पाने की आवश्यकता थी। मैं यह पता लगाने में सक्षम था कि कौन से लॉगर को log_names से जोड़ना है:

from flask import Flask
app = Flask(__name__)

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

साइड नोट: यह अच्छा होगा अगर कोई फ्लास्कैप.गेटलॉगर () या ऐसा कुछ था, तो यह संस्करणों में अधिक मजबूत था। कोई विचार?

कुछ और महत्वपूर्ण शब्द: फ्लास्क टेस्ट लॉग स्टडआउट आउटपुट निकालते हैं

का शुक्र है:


7

अन्य उत्तरों में से किसी ने भी मेरे लिए सही ढंग से काम नहीं किया, लेकिन मुझे पीटर की टिप्पणी के आधार पर एक समाधान मिला । फ्लास्क जाहिर तौर पर loggingलॉगिंग के लिए उपयोग नहीं करता है, और क्लिक पैकेज पर स्विच किया गया है। ओवरराइड करके click.echoऔर click.sechoमैंने फ्लास्क के स्टार्टअप संदेश को समाप्त कर दिया 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()

लॉगिंग स्तर को सेट करने ERRORऔर खाली कार्यों के साथ क्लिक विधियों को ओवरराइड करने के बीच , सभी गैर-त्रुटि लॉग आउटपुट को रोका जाना चाहिए।


6

दबाने के लिए Serving Flask app ...:

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

1
यह मेरे लिए काम करता है, मैंने इसका उपयोग तब किया जब फ्लास्क एप्लिकेशन (नाक 2 का उपयोग करके) यह टर्मिनल में अव्यवस्था को हटाता है। धन्यवाद
CPK

6

देर से जवाब लेकिन मुझे EACH AND EVERY CONSOLE MESSAGE (एक abort(...)त्रुटि के दौरान प्रदर्शित किए गए सहित ) को दबाने का एक तरीका मिला ।

import os
import logging

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

यह मूल रूप से स्लावा वी और टॉम वोजिक द्वारा दिए गए उत्तरों का एक संयोजन है


-1

यदि आप वास्तव में प्रिंट () स्टेटमेंट के साथ कंसोल में लॉग इन करने के लिए कुछ भी नहीं चाहते हैं, तो यह करने के लिए एक क्रूर बल तरीका है logging.basicConfig(level=logging.FATAL)। यह उन सभी लॉग को निष्क्रिय कर देगा जो घातक स्थिति में हैं। यह मुद्रण को अक्षम नहीं करेगा, लेकिन हाँ, बस एक विचार: /

संपादित करें: मुझे एहसास हुआ कि मेरे द्वारा उपयोग किए गए दस्तावेज़ का लिंक न देना मेरे लिए स्वार्थी होगा :) https://docs.python.org/3/howto/log.html#logging-basic-tutorial


-3

पहला बिंदु: आधिकारिक फ्लास्क प्रलेखन के अनुसार, आपको app.run () का उपयोग करके फ्लास्क एप्लिकेशन नहीं चलाना चाहिए। सबसे अच्छा समाधान uwsgi का उपयोग कर रहा है, इसलिए आप कमांड का उपयोग करके डिफ़ॉल्ट फ्लास्क लॉग को अक्षम कर सकते हैं "

उदाहरण के लिए:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.