2011-05-04 25 views
17

Tôi đã làm một số tìm kiếm, nhưng tôi tự hỏi nếu có ai có một đoạn của một cấu hình đăng nhập để có được Django để chỉ đầu ra một stack trace để stdout (vì vậy tôi có thể nhìn thấy nó trong cửa sổ Terminal) khi nó gặp lỗi trong khi yêu cầu. Điều này đặc biệt cho phát triển/gỡ lỗi cục bộ và chủ yếu là khi tôi thực hiện các yêu cầu bài AJAX và tôi phải xem xét HTML trong Firebug để tìm ra lỗi nào xảy ra trên dòng.In một ngăn xếp theo dõi để stdout trên lỗi trong Django trong khi sử dụng manage.py runserver

+0

"Cửa sổ đầu cuối"? Bạn đang chạy 'django-admin.py runserver'? –

+0

Có, 'manage.py runserver' cục bộ, nhưng điều này cũng hữu ích cho việc sản xuất, mặc dù ở đó tôi nhận được email, vì vậy ít vấn đề hơn. – Bialecki

+0

cách tiếp cận "sản xuất" phụ thuộc vào cách bạn được tích hợp với Apache, vì vậy bạn sẽ cần phải cung cấp thêm chi tiết về cấu hình đó để đảm bảo chúng tôi hiểu. –

Trả lời

20

Bạn có thể tạo một phần phần mềm trung gian để thực hiện việc này. Đây là đoạn mã được sửa đổi mà tôi đang sử dụng cho một dự án:

class ExceptionLoggingMiddleware(object): 
    def process_exception(self, request, exception): 
     import traceback 
     print traceback.format_exc() 

Đặt trình xử lý này vào phần giữa của cài đặt Django.

0

Bộ xử lý lớp con WSGI, làm bất cứ điều gì bạn muốn với traceback trong định nghĩa handle_uncaught_exception và sử dụng WSGIHandler của bạn thay vì được cung cấp bởi django khi triển khai.

import traceback 
from django.core.handlers.wsgi import WSGIHandler 

class MyWSGIHandler(WSGIHandler): 
    """WSGI Handler which prints traceback to stderr""" 
    def handle_uncaught_exception(self, request, resolver, exc_info): 
     traceback.print_tb(exc_info[2], file=sys.stderr) 
     return super(WSGIHandler, self).handle_uncaught_exception(request, resolver, exc_info) 

Được sử dụng với Apache/mod_wsgi, điều này nên viết traceback trong nhật ký lỗi của Apache

24

phương pháp khác là với Logging. Cụ thể bạn sẽ có được một stacktrace khi chạy ./manage.py runserver bằng cách thêm dòng sau vào các settings.py file:

LOGGING = { 
    'version': 1, 
    'handlers': { 
     'console':{ 
      'level':'DEBUG', 
      'class':'logging.StreamHandler', 
     }, 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers':['console'], 
      'propagate': True, 
      'level':'DEBUG', 
     } 
    }, 
} 

cú pháp này xuất phát từ các tài liệu Django Configuring Logging và có thể được sửa đổi thêm để tăng hoặc giảm số lượng console- ghi nhật ký.

Ngoài ra 5XX câu trả lời được đưa ra như thông báo lỗi và 4XX câu trả lời được đưa ra là thông điệp cảnh báo.

Lưu ý rằng câu hỏi này & câu trả lời có bản sao năm 2013 here.

+3

Đây phải là phương pháp ưa thích theo ý kiến ​​của tôi. Bạn có quyền kiểm soát nhiều hơn đối với những gì bạn muốn sử dụng, những gì bạn muốn đăng nhập. – Andre

0

Tôi gặp sự cố tương tự, nhưng tùy chọn phần mềm trung gian không giúp tôi. Lý do là tôi đang sử dụng django-jsonview 0.4.3 cung cấp một trang trí chuyển đổi một từ điển thành một câu trả lời json hợp lệ http, ngay cả khi chức năng trang trí thất bại, vì vậy phương thức middleware process_exception không bao giờ được gọi. Tôi đã kiểm tra mã của trang trí này và có vẻ như nó cố gắng để đăng nhập lỗi làm điều này:

... 
except Exception as e: 
    logger = logging.getLogger('django.request') 
    logger.exception(unicode(e)) 

Tuy nhiên, tôi không biết tại sao, điều này không làm việc và không có gì được đăng nhập vào giao diện điều khiển bash của tôi. Tôi nên tìm hiểu lý do tại sao điều này xảy ra. Trong khi đó, tôi đang sử dụng một trang trí thêm:

def log_errors(func): 
    if not settings.DEBUG: 
     return func 

    def wrapper(request, *args, **kwargs): 
     try: 
      return func(request, *args, **kwargs) 
     except: 
      print traceback.format_exc() 
    return wrapper 

Sau đó, trong tất cả các quan điểm json tôi:

@json_view 
@log_errors 
def my_view(request): 
    .... 
1

Tôi thường sử dụng này:

except Exception,e: 
     # Get line 
     trace=traceback.extract_tb(sys.exc_info()[2]) 
     # Add the event to the log 
     output ="Error in the server: %s.\n" % (e) 
     output+="\tTraceback is:\n" 
     for (file,linenumber,affected,line) in trace: 
      output+="\t> Error at function %s\n" % (affected) 
      output+="\t At: %s:%s\n" % (file,linenumber) 
      output+="\t Source: %s\n" % (line) 
     output+="\t> Exception: %s\n" % (e) 

Sau đó, tôi sử dụng "đầu ra "cho bất cứ điều gì tôi cần: in để stdout, gửi email, vv ...

11

It's st phạm vi không ai đề cập đến cài đặt DEBUG_PROPAGATE_EXCEPTIONS.Nó không phải cho sản xuất, nhưng rất dễ sử dụng trong môi trường thử nghiệm/gỡ lỗi. Chỉ cần thêm vào settings.py:

DEBUG_PROPAGATE_EXCEPTIONS = True 
+1

Chính xác điều này có vẻ là câu trả lời phù hợp nhất :) – sudhanshu

+0

+1 cho những gì đáng giá, sau một vài giờ gỡ lỗi một vấn đề DRF và không có nhiều thử nghiệm/tùy chọn để thử, bạn đã lưu lại ngày của tôi ... – jliendo

+0

Điều này chắc chắn sẽ là câu trả lời được chấp nhận, cảm ơn bạn rất nhiều! –

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