2009-12-18 32 views
9

Nó đang chạy dưới DEBUG = Chế độ thực. Đôi khi nó có thể ném ra một thông báo lỗi với thông tin truy nguyên khi gặp lỗi nhưng đôi khi nó chỉ hiển thị các dòng sau:Django Unhandled Exception

Unhandled Exception 

An unhandled exception was thrown by the application. 

Tôi phải chuyển sang máy chủ phát triển để xem thông báo chi tiết.

Tôi làm cách nào để luôn hiển thị thông báo truy xuất khi gặp phải lỗi?

+0

Vì vậy, việc hiển thị lỗi không nhất quán, có bất kỳ mẫu nào cho lỗi nào được hiển thị hay không và lỗi nào không hiển thị? –

+0

Bạn phục vụ trang web như thế nào? Bạn nói dưới Nginx, nhưng nó là FastCGI? –

Trả lời

6

lẽ bạn có thể sử dụng đoạn mã này, điều này sẽ đăng nhập ngoại lệ trong log apache:

utils.py:

def log_traceback(exception, args): 
    import sys, traceback, logging 
    exceptionType, exceptionValue, exceptionTraceback = sys.exc_info() 
    logging.debug(exception) 
    logging.debug(args) 
    for tb in traceback.format_exception(exceptionType, exceptionValue, exceptionTraceback): 
     logging.debug(tb) 

site_logging.py:

import logging 
import sys 

logger = logging.getLogger('') 
logger.setLevel(logging.DEBUG) 
handler = logging.StreamHandler(sys.stderr) 
handler.setLevel(logging.DEBUG) 
formatter = logging.Formatter('%(levelname)-8s %(message)s') 
handler.setFormatter(formatter) 
logger.addHandler(handler) 

Đặt nó trong bạn settings.py:

import site_logging 

Và trong mã của bạn:

from where.is.your.utils import log_traceback 
try: 
    `do something` 
except Exception, args: 
    log_traceback(Exception, args) 
1

Đó là những gì DEBUG = Đúng là: để hiển thị toàn bộ dấu vết. Ý tưởng là người dùng thường xuyên không muốn (cũng không bạn muốn họ) thấy bất cứ điều gì khác hơn là một thông báo lỗi đơn giản.

+0

Có một số lỗi xảy ra ngoài xử lý 500 trang gỡ rối, nơi bạn vẫn nhận được lỗi thô từ máy chủ web. –

+0

Vâng, tôi đã nhận thấy quá rằng đôi khi tôi nhận được các trang lỗi mod_python chứ không phải là trang Django. – JAL

3

Bạn đang sử dụng Apache?
Chỉ cần quan tâm là sản xuất của bạn hoặc môi trường Dev nơi bạn muốn xem traceback?

Từ DJango Book on security - Exposed error messages

Người dùng triển khai dưới Apache và mod_python cũng nên chắc chắn rằng họ có PythonDebug Tắt trong file conf Apache của họ; điều này sẽ đảm bảo rằng mọi lỗi xảy ra trước khi Django có cơ hội tải sẽ không được hiển thị công khai.

Tôi giả sử bạn muốn sử dụng PythonDebug On, điều này chỉ được khuyến nghị cho Phát triển.

+0

@Ralph, tôi đang sử dụng Nginx. – jack

+0

Tôi đang sử dụng mod_python với PythonDebug Tắt và tôi vẫn có thể chuyển đổi DEBUG = True trong cài đặt của mình để khắc phục sự cố nhanh chóng. Nó vẫn mang lại cho tôi trang sửa lỗi django tiện dụng thay vì trang lỗi máy chủ nội bộ 500 của apache. –

+0

xin lỗi Jack, đã không sử dụng Nginx, vì vậy có thể một người nào đó với Nginx có thể giúp giải quyết sự cố. Brandon - đây có phải là một Nginx cụ thể không? –

9

Chỉ cần kết nối với tín hiệu got_request_exception và đăng nhập các ngoại lệ:

from django.core.signals import got_request_exception 
import logging  

def log(*args, **kwargs): 
    logging.exception('error') 

got_request_exception.connect(log) 

này sẽ đăng toàn bộ dấu vết. Trong máy chủ dev, nó sẽ ghi lại trong bảng điều khiển.