Tắt thông báo bảng điều khiển trong máy chủ Flask


90

Tôi có một máy chủ Flask đang chạy ở chế độ độc lập (đang sử dụng app.run()). Tuy nhiên, tôi không muốn có bất kỳ thông báo nào trong bảng điều khiển, như

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

Làm cách nào để tắt chế độ tiết?


Vì vậy, bây giờ bạn có ứng dụng đá ra khỏi chủ đề (mà là đủ khó để gỡ lỗi bản thân) và bây giờ bạn đang đi để ngăn chặn khai thác gỗ trên đầu về điều đó? Eesh, nghe có vẻ trái ngược với những gì tôi sẽ làm .. Ghi nhật ký của bạn càng dài càng tốt (rõ ràng là miễn là nó có liên quan;)).
Demian Brecht

6
@DemianBrecht Vấn đề là, nhật ký được gửi đến stderrnhưng chúng chỉ ghi lại mỗi giao dịch HTTP, loại không liên quan đối với tôi ...
ATOzTOA

Câu trả lời:


130

Bạn có thể đặt cấp của trình ghi Werkzeug thành LỖI, trong trường hợp đó, chỉ các lỗi được ghi lại:

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

Đây là một ví dụ hoạt động đầy đủ được thử nghiệm trên 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
Điều này dường như không ngăn các bản ghi HTTP chuyển sang stderr; Nó KHÔNG dừng thông báo "đang bắt đầu" (rõ ràng có tên mô-đun "werkzeug" ở định dạng nhật ký ".
rsb

2
Làm việc cho tôi. Các thông báo gỡ lỗi yêu cầu được hỗ trợ. Sử dụng Python 3.5.2, Flask 0.12 và Werkzeug 0.11.11
JackLeEmmerdeur

3
Cũng hoạt động bằng Python 3.6, Flask 0.12 và Werkzeug 0.11.15.
vallentin

8
Đáng tiếc là không còn đầy đủ các công trình do Flask sử dụngclick.secho
Peter

1
Thay đổi mức độ ghi nhật ký không phải là giải pháp để tránh chỉ ghi một yêu cầu cụ thể.
gent

11

Giải pháp này cung cấp cho bạn một cách để lấy bản in của riêng bạn và dấu vết ngăn xếp nhưng không có nhật ký mức thông tin từ bình hút như 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

Điều này hoạt động khi chạy cục bộ máy chủ của tôi, nhưng kỳ lạ trên Heroku, nó không.
Garrett

10

Giải pháp @Drewes hầu hết hoạt động, nhưng trong một số trường hợp, tôi vẫn có xu hướng nhận được nhật ký werkzeug. Nếu bạn thực sự không muốn nhìn thấy bất kỳ người nào trong số họ, tôi khuyên bạn nên tắt nó như vậy.

from flask import Flask
import logging

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

Đối với tôi, nó đã thất bại khi abort(500)được nâng lên.


8

Trong trường hợp bạn đang sử dụng máy chủ WSGI, vui lòng đặt nhật ký thành Không có

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

Đây là giải pháp duy nhất phù hợp với tôi và tôi sử dụng Flask với WSGIServer
Woody

7

Một lý do khác mà bạn có thể muốn thay đổi kết quả ghi nhật ký là để kiểm tra và chuyển hướng nhật ký máy chủ đến tệp nhật ký.

Tôi cũng không thể làm cho đề xuất ở trên hoạt động, có vẻ như trình ghi nhật ký được thiết lập như một phần của ứng dụng khởi động. Tôi đã có thể làm cho nó hoạt động bằng cách thay đổi các cấp độ nhật ký sau khi khởi động ứng dụng:

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

Thật không may * Running on localhost:9151, kiểm tra sức khỏe và đầu tiên vẫn được in theo tiêu chuẩn, nhưng khi chạy nhiều kiểm tra, nó sẽ làm sạch đầu ra một tấn.

"Vậy tại sao log_names?", Bạn hỏi. Trong trường hợp của tôi, có một số nhật ký bổ sung mà tôi cần phải loại bỏ. Tôi có thể tìm thấy trình ghi nhật ký nào để thêm vào log_names qua:

from flask import Flask
app = Flask(__name__)

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

Lưu ý bên cạnh: Sẽ thật tuyệt nếu có một ứng dụng chạy nhanh (flash ).getLogger () hoặc một cái gì đó để tính năng này mạnh mẽ hơn trên các phiên bản. Có ý kiến ​​gì không?

Một số từ khóa khác: nhật ký kiểm tra bình loại bỏ đầu ra stdout

nhờ vào:


6

Để ngăn chặn Serving Flask app ...:

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

1
Điều này phù hợp với tôi, tôi đã sử dụng nó khi thử nghiệm ứng dụng bình (sử dụng mũi2), điều này sẽ loại bỏ sự lộn xộn trong thiết bị đầu cuối. Cảm ơn
CpK

6

Câu trả lời muộn nhưng tôi đã tìm ra cách để loại bỏ MỖI VÀ MỌI THÔNG ĐIỆP (bao gồm cả những tin nhắn hiển thị khi bị abort(...)lỗi).

import os
import logging

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

Về cơ bản, đây là sự kết hợp các câu trả lời được đưa ra bởi Slava VTom Wojcik


6

Không có câu trả lời nào khác phù hợp với tôi, nhưng tôi đã tìm ra giải pháp dựa trên nhận xét của Peter . Flask dường như không còn sử dụng loggingđể ghi nhật ký và đã chuyển sang gói nhấp chuột . Bằng cách ghi đè click.echoclick.sechotôi đã loại bỏ thông báo khởi động của Flask khỏi 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()

Giữa việc thiết lập mức ghi nhật ký ERRORvà ghi đè các phương thức nhấp chuột có chức năng trống, tất cả đầu ra nhật ký không lỗi phải được ngăn chặn.


-1

Một cách thô bạo để làm điều đó nếu bạn thực sự không muốn bất cứ thứ gì đăng nhập vào bảng điều khiển bên cạnh các câu lệnh print () logging.basicConfig(level=logging.FATAL). Điều này sẽ vô hiệu hóa tất cả các nhật ký có trạng thái là nghiêm trọng. Nó sẽ không vô hiệu hóa tính năng in nhưng vâng, chỉ là một suy nghĩ: /

CHỈNH SỬA: Tôi nhận ra rằng thật ích kỷ nếu không đặt liên kết đến tài liệu tôi đã sử dụng :) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial


-3

Điểm đầu tiên: Theo tài liệu chính thức của Flask, bạn không nên chạy ứng dụng Flask bằng app.run (). Giải pháp tốt nhất là sử dụng uwsgi, vì vậy bạn có thể tắt nhật ký bình mặc định bằng lệnh "--disable-logging"

Ví dụ:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.