2014-07-01 19 views
9

Đối với cuộc sống của tôi, tôi không thể tìm ra nơi mà lỗi của tôi đến từ ứng dụng Flask của tôi khi tôi chạy qua gunicorn, vì tôi không thể tìm ra cách để hiển thị dấu vết ngăn xếp.Cách xem ngoại lệ trong ứng dụng Flask + gunicorn?

Ví dụ, giả sử tôi có một rất đơn giản "Hello, World!" ứng dụng được viết bằng Flask.

import logging 
import os 
from flask import Flask 

app = Flask(__name__) 
app.debug = True 

@app.route('/') 
def hello(): 
    raise Exception('Exception raised!') 
    return 'Hello World!' 

if __name__ == '__main__': 
    app.run() 

Nếu tôi chạy này với python hello.py, sau đó tất cả là tốt, khi tôi nhận được một vết đống rất hữu ích:

(venv)142:helloflask $ python hello.py 
* Running on http://127.0.0.1:5000/ 
* Restarting with reloader 
127.0.0.1 - - [30/Jun/2014 18:52:42] "GET/HTTP/1.1" 500 - 
Traceback (most recent call last): 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/Users/grautur/code/helloflask/hello.py", line 10, in hello 
    raise Exception('Exception raised!') 
Exception: Exception raised! 

Tuy nhiên, nếu tôi có thể tạo một Procfile với

web: gunicorn hello:app 

và sau đó bắt đầu ứng dụng với foreman start -p 8000, sau đó tôi không thấy gì cả. Chỉ là trang web "Lỗi Máy chủ Nội bộ".

$ foreman start -p 8000 
18:56:10 web.1 | started with pid 36850 
(...nothing else is ever displayed...) 

Làm cách nào để ứng dụng Flask + gunicorn hiển thị các thông báo gỡ lỗi hữu ích hơn? Tôi đã thử thiết lập app.debug = True (và nhiều lần lặp lại của chúng), vì nó có vẻ như các bài viết StackOverflow khác được đề xuất, nhưng dường như không thay đổi bất cứ điều gì.

+0

Xin chào, bạn đã tìm thấy giải pháp chưa? – DavidLin

+0

Gunicorn là đăng nhập để stderr theo mặc định và lý do duy nhất tôi có thể nghĩ rằng có thể giải thích những gì bạn thấy, là nếu gunicorn đăng nhập vào một tập tin (trong trường hợp bạn không nhận được gì trên stderr hoặc stdout). Bạn đã thử btw chưa? I E. để cấu hình gunicorn để đăng nhập vào các tập tin với 'web: gunicorn --error-logfile = hello-gunicorn.log --access-logfile = hello-gunicorn-access.log hello: app' và xem những gì được đăng nhập ở đó? – dimi

Trả lời

5

Tôi không quen thuộc với Foreman, vì vậy không chắc chắn nếu nó cần phải được cấu hình trong bất kỳ cách nào, nhưng đối với Gunicorn để đăng nhập bất cứ điều gì, trước tiên bạn cần phải thiết lập đăng nhập cho ứng dụng Flask của bạn.

Cách đơn giản để làm điều đó sẽ là như sau:

import logging 

# Log only in production mode. 
if not app.debug: 
    stream_handler = logging.StreamHandler() 
    stream_handler.setLevel(logging.INFO) 
    app.logger.addHandler(stream_handler) 

StreamHandler bản ghi để stderr theo mặc định. Nếu bạn muốn đăng nhập vào một tệp, Gunicorn có các tuỳ chọn --access-logfile--error-logfile.

Đối với giải thích chi tiết hơn và một vài ý tưởng tốt về xử lý lỗi Flask thấy docs.

+0

Python cũng có 'logging.FileHandler' và' RotatingFileHandler' và 'TimedRotatingFileHandler' trong số những người khác –

0

Tôi thấy rằng khi Gunicorn được kích hoạt bằng tập lệnh Upstart (Ubuntu 14.04 LTS), lỗi từ Flask đã được ghi vào /var/log/upstart/YOUR_UPSTART_SCRIPT.log.

Không có vấn đề gì khác tôi đã thử, ví dụ: giải pháp của @Audrius Kažukauskas, tôi chỉ đơn giản là không thể nhìn thấy bất kỳ lỗi hoặc tracebacks bất cứ nơi nào.

Các vấn đề liên quan