konsola veya Django sitesinde dosyaya tüm hataları Log

oy
13

Nasıl Django 1.0 yazmayı alabilirsiniz tüm hata ayıklama modunda runserver çalıştırırken konsolu veya bir günlük dosyasına hataları?

Ben bu soruya kabul edilen yanıt açıklandığı gibi process_exception fonksiyonlu bir katman sınıfını kullanarak denedim:

Eğer Django sitelerinde sunucu hataları log nasıl

process_exception fonksiyonu bazı istisnalar için çağrılır (örn: assert (views.py olarak) False) ama process_exception ImportErrors gibi diğer hatalar çağrısında almıyor (örn: urs.py ithalat thisclassdoesnotexist). Django / Python yeniyim. Bunun nedeni çalışma zamanında ve derleme sırasında hatalar arasında bazı ayrım var mı? Ama sonra bir derleme zamanı hatası oldu ve bunları yapmazsa runserver şikayet beklenebilir.

Django ayıklama (Simon Willison fantastik sunum izledim http://simonwillison.net/2008/May/22/debugging/ ) ama benim için çalışacak bir seçenek görmedim.

Konu ile ilgili olduğunu durumda, ben bir Facebook uygulaması ve Facebook maskelerini HTTP kendi mesajla yerine Django Dehşet bilgilendirici 500 sayfa gösteren 500 hataları yazıyorum. Yani için bir yol gerek tüm hataların türlerini konsolu veya dosyaya yazılacak.

Düzenleme: Ben beklenti ben urls.py kötü bir ithalat (ImportError) olduğunda Django ayrıntı dolu bir 500 hata sayfası iade edip etmeyeceği olmadan konsola aynı detay veya bir dosya yazabilir gerektiğidir tahmin kodunda herhangi ek bir özel durum işleme eklemek zorunda. Ben ithalat ifadeleri etrafında durum işleme görmemiştim.

Teşekkürler, Jeff

Oluştur 27/03/2009 saat 18:30
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
2

Öncelikle, bir İstisna günlüğüne aracılığıyla göreceksiniz çok az derleme zamanı hataları vardır. Python kodu geçerli sözdizimi yoksa, bu günlükleri yazmak için açılmış çok önce ölür.

Django runserver modunda, bir "baskı" deyimi Gördüğünüz Stdout'a, yazar. Bu ancak, bu yüzden güvenme, iyi bir uzun vadeli bir çözüm değildir.

Django Apache altında çalışırken, ancak, hangi kullandığınız eklenti bağlıdır. Mod_python başa kolay değildir. mod_wsgi bir günlük dosyasına stdout ve stderr gönderme içine zorla edilebilir.

Yapabileceğiniz en iyi şey, ancak, günlük modülü. Üst düzey içine başlatma koyun urls.pygünlüğünü yapılandırma. (Ya da, belki, senin settings.py)

Her modül günlük iletilerini yazmak için kullanılabilen bir kayıt cihazına sahiptir emin olun.

Her web hizmetleri beraber çevresinde bloğu dışında bir deneyin / sahiptir yapmak diyoruz ve sizin günlüğüne istisnalar yazma emin olun.

Cevap 27/03/2009 saat 19:51
kaynak kullanıcı

oy
13

Biraz aşırı, ama Hata ayıklama amacıyla, size açmak DEBUG_PROPAGATE_EXCEPTIONSayarı. Bu, kendi hata işleme kurmak için izin verecektir. Kurmak için en kolay yolu hata işleme geçersiz kılmak olacağını söyledi sys.excepthook . Bu başvurunuzu sona erer, ancak çalışacaktır. Orada bu uygulamanızı öldürmez olmak için yapabileceğiniz şeyler olabilir, ama bu sizin için bu dağıtma hangi platform bağlıdır. Her halükarda, üretimde kullanmak asla!

üretim için, hemen hemen yerinde geniş hata kaldırmaz zorunda olacak. Ben kullandım tekniklerden biri böyle bir şey olur:

>>> def log_error(func):
...     def _call_func(*args, **argd):
...         try:
...             func(*args, **argd)
...         except:
...             print "error" #substitute your own error handling
...     return _call_func
...
>>> @log_error
... def foo(a):
...     raise AttributeError
...
>>> foo(1)
error

Eğer görünümünde bir dekoratör olarak log_error kullanmak, otomatik olarak hataları içindeki ne olduysa işleyecektir.

Süreç _istisna fonksiyonu bazı istisnalar için çağrılır (örn: assert views.py olarak) (Yanlış) ancak sürecin _istisna ImportErrors gibi diğer hatalar çağrısında almıyor (örn: urs.py ithalat thisclassdoesnotexist). Django / Python yeniyim. Bunun nedeni çalışma zamanında ve derleme sırasında hatalar arasında bazı ayrım var mı?

Python, tüm hatalar çalışma zamanı hatalarıdır. görünümünüzü hiç çağrılmadan önce modül içe aktarıldığında bu hatalar hemen gerçekleşir çünkü bu soruna neden oluyorsa nedeni budur. Ben yayınlanmıştır İlk yöntem ayıklama için bu gibi hataları yakalayacak. Sen üretim için bir şeyler anlamaya mümkün olabilir, ama bir üretim uygulamasında ImportErrors alıyoruz (ve herhangi bir dinamik ithal yapmıyoruz) eğer daha kötü sorunları olduğunu iddia ediyorum.

Gibi bir araç PyLint Gerçi bu tür problemlerin ortadan kaldırmaya yardımcı olabilir.

Cevap 27/03/2009 saat 20:51
kaynak kullanıcı

oy
-1

Bir * Nix sistemde ise yapabildin

Daha sonra konsolda "tail -f mylog.txt" çalıştırmak python günlüğüne (örn. mylog.txt) yazma

Bu neredeyse gerçek zamanlı olarak günlüğün her türlü görüntülemek için kullanışlı bir yoldur

Cevap 28/03/2009 saat 23:03
kaynak kullanıcı

oy
6

process_exception fonksiyonu bazı istisnalar için çağrılır (örn: assert (views.py olarak) False) ama process_exception ImportErrors gibi diğer hatalar çağrısında almıyor (örn: urs.py ithalat thisclassdoesnotexist). Django / Python yeniyim. Bunun nedeni çalışma zamanında ve derleme sırasında hatalar arasında bazı ayrım var mı?

Hayır, sırf bu bir istisna görünümünde yükseltilir ise process_exception katman sadece denir .

Bence DEBUG_PROPAGATE_EXCEPTIONS (Jason Baker tarafından ilk belirtildiği gibi) buraya ne gerek, ama eğer sadece traceback konsola terk ek bir şey yapmanız gerekmez (yani sys.excepthook, vs) sanmıyorum.

Eğer (yani o dosya veya DB için dump) hata ile bir şey daha karmaşık yapmak istiyorsanız, en basit bir yaklaşım olur got_request_exception sinyali Django o görünümü veya değil büyüdü olsun, herhangi bir istek ile ilgili istisna için gönderir.

MESAJ_AL ve handle_uncaught_exception django.core.handlers.BaseHandler yöntemleri bu alanda öğretici (ve kısa) okuma vardır.

kodunda herhangi ek bir özel durum işleme eklemek zorunda kalmadan. Ben ithalat ifadeleri etrafında durum işleme görmemiştim.

Biraz daha Çevrene bak, o (genellikle bazı belirli bir şekilde bir bağımlılık yokluğunu işlemek isteyen durumlarda) yapılır göreceksiniz. Yani yağmurlama gitmek zorunda elbette oldukça çirkin olacağını söyledi ek deneme-haricinde bloklar Kodunuzdaki üzerinden tüm istisnalar nasıl işleneceğini için genel bir değişiklik yapmak için!

Cevap 30/03/2009 saat 05:53
kaynak kullanıcı


Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more