ฉันมีเซิร์ฟเวอร์ Flask ที่ทำงานในโหมดสแตนด์อโลน (โดยใช้app.run()
) แต่ฉันไม่ต้องการข้อความใด ๆ ในคอนโซลเช่น
127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...
ฉันจะปิดโหมด verbose ได้อย่างไร?
ฉันมีเซิร์ฟเวอร์ Flask ที่ทำงานในโหมดสแตนด์อโลน (โดยใช้app.run()
) แต่ฉันไม่ต้องการข้อความใด ๆ ในคอนโซลเช่น
127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...
ฉันจะปิดโหมด verbose ได้อย่างไร?
stderr
แต่พวกเขากำลังบันทึกธุรกรรม HTTP แต่ละรายการซึ่งไม่เกี่ยวข้องกับฉัน ...
คำตอบ:
คุณสามารถตั้งค่าระดับของตัวบันทึก Werkzeug เป็น ERROR ได้ในกรณีนี้จะบันทึกเฉพาะข้อผิดพลาดเท่านั้น:
import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
นี่คือตัวอย่างการทำงานอย่างสมบูรณ์ที่ทดสอบบน 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()
click.secho
โซลูชันนี้ช่วยให้คุณได้รับงานพิมพ์และสแต็กเทรซของคุณเอง แต่ไม่มีบันทึกระดับข้อมูลจากการดูดขวด 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
โซลูชัน @Drewes ใช้งานได้เกือบตลอดเวลา แต่ในบางกรณีฉันมักจะได้รับบันทึก werkzeug หากคุณไม่ต้องการเห็นสิ่งเหล่านี้จริงๆฉันขอแนะนำให้คุณปิดการใช้งานแบบนั้น
from flask import Flask
import logging
app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
app.logger.disabled = True
สำหรับฉันมันล้มเหลวเมื่อabort(500)
ถูกเลี้ยงดู
ในกรณีที่คุณใช้เซิร์ฟเวอร์ WSGI โปรดตั้งค่าบันทึกเป็นไม่มี
gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)
ไม่มีคำตอบอื่น ๆ ทำงานอย่างถูกต้องสำหรับผม แต่ผมพบว่าวิธีการแก้ปัญหาตามออกความคิดเห็นของปีเตอร์ เห็นได้ชัดว่า Flask ไม่ใช้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
และการแทนที่วิธีการคลิกด้วยฟังก์ชันว่างควรป้องกันเอาต์พุตบันทึกที่ไม่ใช่ข้อผิดพลาดทั้งหมด
อีกเหตุผลหนึ่งที่คุณอาจต้องการเปลี่ยนเอาต์พุตการบันทึกคือสำหรับการทดสอบและเปลี่ยนเส้นทางบันทึกของเซิร์ฟเวอร์ไปยังไฟล์บันทึก
ฉันไม่สามารถรับคำแนะนำข้างต้นเพื่อใช้งานได้ดูเหมือนว่ามีการตั้งค่าคนตัดไม้เป็นส่วนหนึ่งของแอปเริ่มต้น ฉันสามารถทำให้มันใช้งานได้โดยเปลี่ยนระดับการบันทึกหลังจากเริ่มแอพ:
... (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)
หมายเหตุด้านข้าง: คงจะดีถ้ามี flaskapp.getLogger () หรืออะไรสักอย่างเพื่อให้มีประสิทธิภาพมากขึ้นในทุกเวอร์ชัน ความคิดใด ๆ ?
คำสำคัญเพิ่มเติม: บันทึกการทดสอบขวดจะลบเอาต์พุต stdout
ขอบคุณ:
ในการปราบปรามServing Flask app ...
:
os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()
คำตอบที่ล่าช้า แต่ฉันพบวิธีระงับแต่ละข้อความและทุกคอนโซล (รวมถึงข้อความที่แสดงระหว่างabort(...)
ข้อผิดพลาด)
import os
import logging
logging.getLogger('werkzeug').disabled = True
os.environ['WERKZEUG_RUN_MAIN'] = 'true'
นี่คือการรวมกันของคำตอบที่Slava VและTom Wojcik ให้ไว้
กำลังดุร้ายวิธีที่จะทำจริงๆถ้าคุณไม่ต้องการอะไรในการเข้าสู่คอนโซลข้างพิมพ์ () logging.basicConfig(level=logging.FATAL)
งบคือการ การดำเนินการนี้จะปิดใช้งานบันทึกทั้งหมดที่มีสถานะเป็นอันตรายถึงชีวิต มันจะไม่ปิดการใช้งานการพิมพ์ แต่ใช่เป็นเพียงความคิด: /
แก้ไข: ฉันรู้ว่าฉันคงเห็นแก่ตัวที่จะไม่ใส่ลิงค์ไปยังเอกสารที่ฉันใช้ :) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial
จุดแรก: ตามเอกสารของ Flask อย่างเป็นทางการคุณไม่ควรเรียกใช้แอปพลิเคชัน Flask โดยใช้ app.run () ทางออกที่ดีที่สุดคือการใช้ uwsgi ดังนั้นคุณสามารถปิดใช้งานบันทึกของขวดเริ่มต้นโดยใช้คำสั่ง "--disable-logging"
ตัวอย่างเช่น:
uwsgi --socket 0.0.0.0:8001 --disable-logging --protocol=http -w app:app