2011-05-04 11 views
17

Ben bazı arama yaptım, ama kimse bir yığın izleme için sadece bir yığın izleme çıktı almak için bir günlüğü yapılandırma bir snippet varsa merak ediyorum (bir istek sırasında bir hatayla karşılaştığında bunu Terminal penceresinden görebilirim. Bu özellikle yerel geliştirme/hata ayıklama için ve özellikle AJAX posta istekleri yaptığımda ve hatanın oluştuğu satırı bulmak için Firebug'daki HTML'ye bakmak zorundayım.Django kullanırken yönetmek için bir yığın izleme django kullanırken yönetmek.py runserver

+0

"Terminal Penceresi" ne ekleyin? 'Django-admin.py runserver' çalıştırıyor musunuz? –

+0

Evet, "manage.py runserver" yerel olarak, ancak bu, e-postalar aldığım halde, daha az sorun olsa da, bu üretim için de yararlı olacaktır. – Bialecki

+0

"üretim" yaklaşımı Apache ile nasıl entegre olduğunuza bağlı olduğundan, anladığımızdan emin olmak için bu yapılandırma hakkında daha fazla ayrıntı sağlamanız gerekir. –

cevap

20

Bunu yapmak için bir parça katman oluşturabilirsiniz.

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

Yeri Django ayarlarının sizin katman kısmında bu işleyici: İşte bir proje için kullanıyorum değiştirilmiş pasajı bu.

0

alt sınıf WSGI işleyicisi, kendi handle_uncaught_exception tanımlı içinde traceback ile her istediklerini ve dağıtırken django tarafından sağlanan yerine WSGIHandler kullanın.

Apache/mod_wsgi ile kullanılır
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) 

, bu Apache hata günlüğüne

24

başka yöntem günlüğünü ile de Traceback yazmalısınız.

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

Bu söz dizimi Django belgelerinde Configuring Logging gelir ve daha fazla artırmak veya konsolu üzerinden miktarını azaltmak için değiştirilebilir: settings.py dosyasına aşağıdaki ekleyerek ./manage.py runserver çalıştırırken Özellikle bir stacktrace olsun günlüğü.

da 5XX tepkileri hata iletileri yetiştirilir ve 4XX tepkileri uyarı mesajları gibi yetiştirilir.

Bu sorunun & yanıt 2013 2013 yinelenen here olduğunu unutmayın.

+3

Bu bence tercih edilen yöntem olmalı. Hangi logger'ları kullanmak istediğiniz hakkında çok daha fazla kontrole sahipsiniz, ne kayıt etmek istediğinizi vs. – Andre

0

Benzer bir sorunla karşılaştım, ancak orta yazılım seçeneği bana yardımcı olmadı. Bunun nedeni, bir dizego-jsonview 0.4.3'ün, bir sözlükte, geçerli bir json http yanıtına dönüştüren bir dekoratörün, dekore edilmiş işlev başarısız olduğunda bile, yani process_exception middleware yönteminin hiçbir zaman çağrılmadığı şekilde kullanıyorum. Bu dekoratör kodunu kontrol edilip buna bunu hatayı günlüğe çalışır görünüyor: Bu çalışmıyor ve hiçbir şey benim bash konsoluna kaydedilir neden

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

Ancak, ben bilmiyorum. Bunun neden olduğunu öğrenmeliyim. Tüm json görünümlerinde, Sonra

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 

: Bu arada ben ekstra bir dekoratör kullanıyorum

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

Bunu genelde kullanın: Sonra

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) 

Kullandığım "çıktı "İhtiyacım olan her şey için: stdout'a yazdır, e-posta gönder, vb ...

11

St aralıkta kimse DEBUG_PROPAGATE_EXCEPTIONS ayarından bahsetmedi.Bu üretim için değil, test/hata ayıklama ortamında kullanmak için çok kolay. Basitçe settings.py:

DEBUG_PROPAGATE_EXCEPTIONS = True 
+1

Tam olarak bu en uygun cevap gibi görünüyor :) – sudhanshu

+0

+1, bir DRF sorunu ve birkaç dakika hata ayıklaması sonrası denemek için daha fazla test/seçenek, sen gerçekten benim gün kurtardı ... – jliendo

+0

Bu kesinlikle kabul edilen cevap olmalı, çok teşekkür ederim! –

İlgili konular