Django sitelerinde sunucu hatalarını nasıl kaydedersiniz


175

Gelişimi ile oynarken Yani, sadece ayarlayabilirsiniz settings.DEBUGiçin Trueve iyi yığın izleme ve istek bilgilerle, bu güzel biçimlendirilmiş görebilirsiniz bir hata karşılaşılması durumunda.

Ama bir tür üretim sitesinde DEBUG=False, şu anda bu hatayı düzeltmek için çalıştığım bilgilerle standart bir hata 500 sayfasını ziyaret edip ziyaret etmeyi tercih ederim;)
Aynı zamanda hepsini günlüğe kaydetmenin bir yoluna sahip olmak istiyorum bu bilgileri (yığın izleme ve istek bilgileri) sunucumdaki bir dosyaya gönderebilir - böylece konsoluma gönderebilir ve hataları kaydırabilir, günlüğü her saat bana e-postayla gönderebilirim.

Bu basit gereksinimleri karşılayan bir django sitesi için hangi günlükleme çözümlerini önerirsiniz? Ben fcgisunucu olarak çalışan uygulama var ve apache web sunucusu (lighttpd gitmeyi düşünüyor rağmen) ön uç olarak kullanıyorum.



2
Günlükleri görüntülemek için nöbetçi
Cherian

Cherian'ın paylaştığı bağlantı artık öldü. Sentry'yi aramaya çalışırsanız, ücretli ve resmi örnekleri için malzeme bulmanız muhtemeldir, ancak burada barındırılan bir örnek oluşturma bağlantısı vardır: docs.sentry.io/server Ayrıca şu anda bakımı yapılan repo: github .com / getsentry / sentry
lehiester

Yanıtlar:


103

Ne zaman DEBUG = False, Django ADMINSayarda listelenen her bir kişiye herhangi bir hatanın tam izini otomatik olarak postalayacaktır , bu da size bildirimleri hemen hemen ücretsiz olarak alır. Daha ayrıntılı denetim istiyorsanız, ayarlanan process_exception()özel duruma erişebilecek bir yöntem tanımlayan bir ara katman sınıfı yazıp ayarlarınıza ekleyebilirsiniz :

http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception

Kişisel process_exception()yöntemi, daha sonra istediğiniz açarken türü ne olursa olsun gerçekleştirebilir:,, konsola yazmaya dosyaya yazma vs., vs.

Düzenleme: Biraz daha az kullanışlı olsa da got_request_exception, istek işleme sırasında bir istisna ile karşılaşıldığında gönderilecek sinyali de dinleyebilirsiniz :

http://docs.djangoproject.com/en/dev/ref/signals/#got-request-exception

Bu değil katman yöntemi ile çalışmak çok daha kolaydır böylece Ancak istisna nesnesine erişim sağlar.


7
logging.exception('Some message')Python'un standart günlükleme modülü ile kullanmanın got_request_exception, tüm yapmanız gereken yığın izlerini kapatmaksa, bir sginal işleyicide iyi çalıştığını unutmayın . Başka bir deyişle, geri izleme hala içinde mevcuttur got_request_exception.
TM.

process_exception'a aktarılan İstisna, yığın izlemesine sahip görünmüyor, bunu almanın bir yolu var mı?
Nick BL

79

Django Sentry, daha önce de belirtildiği gibi gitmek için iyi bir yoldur, ancak düzgün bir şekilde (ayrı bir web sitesi olarak) ayarlanmasıyla ilgili biraz çalışma vardır. Her şeyi basit bir metin dosyasına kaydetmek istiyorsanız, işinize koyacağınız günlük yapılandırmasısettings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/var/log/django/myapp.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'WARNING', # Or maybe INFO or DEBUG
            'propagate': False
        },
    },
}

Katılıyorum, Sentry'i seviyorum! Bunun bir .Net portuna sahip olmak istiyorum (son zamanlarda .Net projeleri üzerinde çalışıyorum).
Gromer

1
Herkesin kesip yapıştırması durumunda küçük bir yazım hatası: Sonunda "yaymak" yerine "propogate".
user1228295

3
'include_html': Truesadece e-postaları "güzel" DEĞİLDİR! Ayarların değerlerini ve yerel değişkenleri içeren tam bir geri izleme içerir. Dokümanlara göre, bu bir güvenlik endişesidir: docs.djangoproject.com/en/1.8/topics/logging/…
Thomas

1
Mail_admins işleyicisinin (ve django.request logger) gerekli olup olmadığını merak ediyorum, çünkü'ctiv_existing_loggers ': False ve varsayılan olarak django günlüğünü bu işleyici (ve logger) ile çoğaltıyor. Test ettiğimde güncelleme yapacağım.
DylanYoung

Lütfen bu cevabı güncelleyin. Django1.9 change-log'dan: Django'nun varsayılan günlük yapılandırması artık 'django.request' ve 'django.security' günlüklerini tanımlamaz.
narendra-choudhary



15

EMP'nin en faydalı kod sunumundan bu yana biraz zaman geçti. Şimdi uyguladım ve bazı manage.py seçeneği ile uğraşırken, bir hatayı kovalamaya çalışmak için, şu anki Django (1.5.?) Sürümümün bir requir_debug_false filtresinin şimdi olduğu etkisine yönelik bir kullanımdan kaldırma uyarısı aldım mail_admins işleyicisi için gereklidir.

Düzeltilmiş kod:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
         'require_debug_false': {
             '()': 'django.utils.log.RequireDebugFalse'
         }
     },
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
            'filters': ['require_debug_false'],
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/home/username/public_html/djangoprojectname/logfilename.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'DEBUG', # Or maybe INFO or WARNING
            'propagate': False
        },
    },
}

Mail_admins işleyicisinin (ve django.request logger) gerekli olup olmadığını merak ediyorum, çünkü'ctiv_existing_loggers ': False ve varsayılan olarak django günlüğünü bu işleyici (ve logger) ile çoğaltıyor. Test ettiğimde güncelleme yapacağım.
DylanYoung

1

Senaryomla ilgili can sıkıcı bir sorun yaşadım fcgi. Django başlamadan önce meydana geldi. Giriş eksikliği çok acı verici. Her neyse, stderr'ı bir dosyaya ilk şey olarak yönlendirmek çok yardımcı oldu:

#!/home/user/env/bin/python
sys.stderr = open('/home/user/fcgi_errors', 'a')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.