İstisnalar için hata günlüğünü yönetmenin en iyi yolu nedir?


13

Giriş

Bir web sitesinde veya sistemde bir hata oluşursa, elbette bunu günlüğe kaydetmek ve kullanıcıya hata için referans kodu içeren nazik bir mesaj göstermek yararlıdır.

Çok fazla sisteminiz varsa, bu bilgilerin noktalı olmasını istemezsiniz - bunun için tek bir merkezi yere sahip olmak iyidir.

En basit düzeyde, gereken tek şey artan bir kimlik ve hata ayrıntılarının serileştirilmiş dökümüdür. (Ve muhtemelen "merkezi yer" bir e-posta gelen kutusudur.)

Spektrumun diğer ucunda, belki de bir düğmeye basmanıza ve günde bir hata grafiğini görmenize veya X sistemindeki en yaygın hata türünün ne olduğunu, A sunucusunun daha fazla veri tabanına sahip olup olmadığını belirlemenize izin veren tamamen normalleştirilmiş bir veritabanıdır. B sunucusundan daha fazla bağlantı hatası vb.

- Ya burada bahsediyorum kod seviyesinde hataları / uzak sistem tarafından istisnalar günlüğe değil vs Jira, Trac, ile yapılır gibi "insan merkezli" sorun izleme,.


Sorular

Özellikle bu konuda sistemi kullanan geliştiricilerden düşünceler arıyorum:

  • Onsuz yapamayacağınız temel özellikler nelerdir?
  • Size gerçekten zaman kazandıracak özelliklere sahip olmanın faydaları nelerdir?
  • Hangi özellikler iyi bir fikir gibi görünebilir, ancak aslında bu kadar kullanışlı değil mi?

Örneğin, bir hatanın birden fazla oluşumunu tanımlayan bir "yinelenenleri göster" işlevinin (farklılık gösterebilecek 'önemsiz' ayrıntılar hakkında endişelenmeden) oldukça gerekli olduğunu söyleyebilirim.
"Bu hata için [Jira / etc] 'de sorun yaratma" düğmesi iyi bir zaman tasarrufu gibi görünür.

Tekrarlamak gerekirse, bu sistemleri kullanan insanlardan, özellikle bir özelliğin neden müthiş / korkunç olduğu konusunda desteklenen pratik deneyimlerim .
(Yine de kuram yapacaksanız, en azından cevabınızı bu şekilde işaretleyin.)


2
Hatırlanması gereken bir şey var: Eğer bir şey kaydediyorsanız, bir şeyler ters gitti ve birden fazla şey yanlış olabilir. Kayıt işlemlerini basit tarafta tutun.
David Thornley

hata ayıklama veya bilgi düzeyinde kayıt yapmak her şeyin yanlış olduğu anlamına gelmez. Örneğin ölüm sonrası analiz için gerekli bilgileri içerebilir.

String.Format (C #) :) kendilerini bir istisna atmak istisnalar günlükleri gördük. Loggin'i basit, tercihen risksiz, dinamik DEĞİL tutun (örn. Bir istisna kaydetmeye çalışırken XML dosyasını ayrıştırmayın). Mümkünse hata günlüğünde dinamizmden kaçının. Bir xml dosyasında yapılandırılmış şeyler varsa, bir hata (dinamik) bildirme ortasındayken, bu yapılandırma dosyasını çalışma zamanında ayrıştırmak yerine, ona dayalı (gerçek) bazı gerçek kodlar oluşturmak daha iyi olduğunu düşünüyorum. ). Zaten benim deneyimimdi. Giriş yapmak için bir B planınız olabilir - eğer fantezi çıktılar başarısız olursa, basit kayıt yapın
Job

Yanıtlar:


5

Microsoft Enterprise kütüphanesini kullanarak günlüğe kaydedilmiş istemci hataları ile bir projede bulundum . Tüm istisna posta kutumuza gönderme. Posta konusunda, yinelenen mesajlardan kaçınmak için seri hata kodunu ekledik. Tabii ki seri mesajlar veritabanında saklamak vb.

Microsoft Enterprise kütüphanesine ve Log4Net'e göz atmanızı tavsiye ederim .

Log4Net'in Bazı Özellikleri

  • Birden çok çerçeve desteği
  • Birden çok günlük hedefine çıktı
  • Hiyerarşik günlük mimarisi
  • XML Yapılandırması
  • Dinamik Yapılandırma
  • Günlük Bağlamı
  • Kanıtlanmış mimari
  • Modüler ve genişletilebilir tasarım • Esneklik ile yüksek performans

1
iyi bir kaydedici, hatalarınızı istediğiniz kalıcılığa (e-posta, DB, dosya vb.) itmenizi sağlar.
Ken Henderson

1

Veritabanı uygulamaları durumunda <TABLE>:<PrimaryKeyID>, özel durumun yakalandığı kapsamla ilgili olarak veritabanındaki kayıtları izlemenizi sağlayan bir tür kimlik (gibi ).

İstisna işleyicisinden, uygulama içindeki bir veritabanı tablosundaki kimliği kaydederek Oracle ve PL / SQL ile yaptım.


En azından işlenen tabloları ve kayıtları kaydetmek kesinlikle iyidir. Daha da iyisi elbette SQL deyimi (ve herhangi bir parametre) deniyor.
Peter Boughton

1

Açıkladığınız şeylerin çoğu (örn. Belirli parçaların günlüğe kaydedilmesi) Amir Rezaei'nin belirttiği gibi kurumsal kütüphanede uygulanır. Diğer her şey analitik kısmından daha fazla gibi görünüyor (yani daha sonra günlüklerle ne yapılacağı).

Benim durumumda, bazı şeyleri kolaylaştıran bazı küçük uygulamalar ve sql komut dosyaları oluşturdum. İşte gerçekten sevdiğim bazı şeyler:

  • Aynı hataları birlikte gruplandırmak (yani, aynı anda yaklaşık 100 kullanıcı aynı hatayı deneyimlemiştir, kaç olay olduğunu not eden 1 hata raporu)
  • Vaka izleyiciye otomatik olarak bilet doldurma (bunu asla 'bir düğmeyi tıklayarak' yapmayı başaramadım, ancak her zaman yapmak istedim)
  • Yazılım kullanıcısının kullanıcı adı (yalnızca makinelerin çoğunda bulunan makinenin değil). Bazı durumlarda, otomatik kullanıcı hesapları sorunlara neden olurken, diğerlerinde belirli kullanıcılar sorunlara neden oluyordu. "Mike'ın biraz iş yapmasını izlemem gerekiyor, o da belirli bir hataya neden oluyor."
  • "Kullanıcı Eylemleri" - Kullanıcı yaptığı gibi her eyleme geçirilebilir tıklama / butona basmanın bir izini tutacak küresel bir yığın vardı ve hata günlüklerine tacked vardı. Hatayı yeniden oluşturmak genellikle bu iz boyunca yürümek ve kullanıcı ile aynı adımları gerçekleştirmekti (İzi ayrıştıracak ve adımları otomatik olarak gerçekleştirecek bir CodedUI test jeneratörü oluşturmayı umuyordum, ancak hiç yapmadım)

0

Bazen, günlük bilgileri diskte depolanmak için çok hacimlidir. Gördüğüm bir yaklaşım, günlük girişlerinizi bir yangın hortumuna (örneğin, perl) böyle bir şeye yazmaktır:

# Create socket.
my $sock = IO::Socket::INET->new(
    Proto       => 'udp',
    PeerAddr    => $bcastaddr,
    Broadcast   => 1,
) or die "Can't create socket ($bcastaddr): $!";

while (<>) {
    chomp;
    unless (/File\ does\ not\ exist:/) {
        $sock->send("$eventtype:$_") or warn "Can't send: $!";
    }
}

o zaman bir analist neye bakmak istediğini anlayabilir.


3
Bir 'yangın hortumu'nun ne olduğundan emin değil misiniz? Bugün disklerin kapasitesi göz önüne alındığında, hataların günlük boyutunun bir sorun olacağı kadar yaygın olmadığını umuyorum.
Peter Boughton

0

Uygulamalarımızdaki hata izlemeden öğrendiğim bazı şeyler:

  • Bir yuvarlanan günlük dosyasını kuyruğa alabilmek (uygulamalarda oturum açmak için genellikle log4net / log4j ve günlüğü takip etmek için BareTail kullanıyorum) bir sistemin mevcut durumunu kontrol edebilmek için gerçekten yararlıdır
  • Sorunların ne zaman tanıtıldığını ve sorunların ortaya çıkma oranını görmek için, raporları çalıştırabileceğiniz zaman damgalarına sahip bir veritabanına sahip olmak güzel.
  • E-posta / sms / sesli uyarılar gönderme yeteneği, sistemlerin açık kalmasını sağlamada süper yardımcıdır, ancak sizi uyaran hata türlerini kolayca özelleştirebilmeniz gerekir. Günde 800 hata e-postası alıyorsanız, "Oh hayır veri merkezi yanıyor".

Log4net için harika sonuçlar aldım, çünkü birden fazla yere giriş yapmayı ve günlük yapılandırmasında değişiklikleri de kolaylaştırır.


0

elmah, ASP.NET uygulamaları için açık kaynaklı bir hata kayıt sistemidir ve mevcut bir sisteme (NuGet http://nuget.codeplex.com/ kullanılarak ) hızlı ve kolay bir şekilde eklenebilir . Çeşitli arka uçları ve bildirim işlevlerini destekler.

Bir web sitesi olarak çalıştığı için bir masaüstü uygulamasına ekleyen kimseyi bilmiyorum ama bir hizmet olarak çalıştırmanızı ve istisnalarınızı web üzerinden göndermenizi engelleyen hiçbir şey yok.

http://code.google.com/p/elmah/

ELMAH (Hata Günlüğü Modülleri ve İşleyicileri), tamamen takılabilir bir uygulama çapında hata günlüğü tesisidir. Yeniden derlemeye veya yeniden konuşlandırmaya gerek kalmadan çalışan bir ASP.NET web uygulamasına, hatta bir makinedeki tüm ASP.NET web uygulamalarına dinamik olarak eklenebilir .

ELMAH çalışan bir web uygulamasına bırakıldıktan ve uygun şekilde yapılandırıldıktan sonra, kodunuzun tek bir satırını değiştirmeden aşağıdaki özellikleri edinebilirsiniz:

  • İşlenmeyen neredeyse tüm istisnaların günlüğe kaydedilmesi.
  • Kaydedilen istisnaların tüm günlüğünü uzaktan görüntülemek için bir web sayfası.
  • Renkli yığın izleri de dahil olmak üzere, kaydedilen herhangi bir istisnanın tüm ayrıntılarını uzaktan görüntülemek için bir web sayfası.
  • Çoğu durumda, ASP.NET'in belirli bir istisna için oluşturduğu orijinal sarı ölüm ekranını,customErrors mod kapalı olsa bile gözden geçirebilirsiniz .
  • Her bir hatanın oluştuğu andaki e-posta bildirimi.
  • Günlükten son 15 hatanın RSS beslemesi ...

ELMAH güvenilir değildir. Httpcontext NULL ==> boom ise
Quandary

@Quandary Bir şey eksik mi acaba? Bir uygulamadan ELMAH'a oturum açmaya çalışırken bir hata görüyoruz ve HttpContext null, ancak bir kök düzeyinde catchiniz varsa -> null bağlam ve log ile yeni elmah logger oluşturun, o zaman iyi çalışır. ASP.NET web sitesinde deneyebileceği ve günlüğe kaydedebileceği yerler var ve HttpContext null?
Ian Grainger
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.