Kaydedici hatalarını nasıl ele almalıyım?


12

Şirketimizin birçok uygulamasında özel bir kayıt cihazı kullanıyoruz. Oldukça sağlamdır, ancak gelecekte NLog gibi bir şeyle değiştirebiliriz. Kaydedicinin görevlerinden biri, uygulamada karşılaşılan istisnaları günlüğe kaydetmektir.

Her zaman yaşadığım bir endişe , logger içindeki istisna işlemenin sessiz bir arızaya izin vermesidir. Yani, günlük belirli bir istisna için yazılmamışsa (kaydedicideki bir hata nedeniyle), bunu nasıl ele almalıyım ve (bir şekilde) logger'ın istisnasını günlüğe kaydetmeliyim ?

Diyelim ki WriteLog işlevi bir istisna veriyor. İşlevi birkaç kez veya istisna atılıncaya kadar çağırmaya çalışmalı mıyım? Kaydedilen istisnayı kaydedici ile yazmaya çalışmalı mıyım (büyük olasılıkla istisnalarla tamamen sonuçlanır.).? Özel kaydediciyi ilk uyguladığımız durumlar dışında bu durumla karşılaşmayacak kadar şanslıydım. Öte yandan, şu anda logger uygulama istisnaları (kendi istisnaları nedeniyle) günlüğü başarısız olup olmadığını bilmek için hiçbir yolu yoktur.

Çevrimiçi ve bazı SE sitelerinde arama yapmayı denedim, ancak şu ana kadar tüm mesajlar bir kaydedicideki hatalarla (ancak potansiyel istisnalar ve nasıl kaydedilmeyecekleri) veya kaydedicinin dışındaki istisnalarla uğraştığından beri sonuçsuz kaldı.



5
stderrÇıktı ortamınızın başarısız olduğunu veya "imkansız" ın olduğunu günlüğe kaydedin.
Doval

1
Geliştiricilere bir e-posta gönderin veya hatayı bir e-posta adresiyle görüntüleyin ve kullanıcının hatayı kopyalayıp yapıştırmasına izin verin.
Chloe

Yanıtlar:


17

Kaydedicinin kendisinde istisnalarla karşılaştığınızda, kaydediciyi kendi istisnalarını kaydetmek için kullanmamalısınız. Bunun nedeni şudur:

  • Sonsuz bir döngüde sıkışmış olabilirsiniz. Kaydedicinizde, test edilmemiş (ve bir istisna oluşturan) koşullu bir dalınız olduğunu düşünün. Koşul karşılandığında, bildirilen diğer istisnaların da aynı dal tarafından ele alındığını düşünün. Bu, şubenin yürütüldüğü andan itibaren sonsuz bir döngü içinde olduğunuz anlamına gelir.

  • Geçici bir döngüde kalabilir ve saniyede binlerce istisna oluşturabilirsiniz. Uzak sunucuya istisnalar bildirdiğinizi düşünün. Sunucuyla ilgili bir sorun, bağlantı geri gelinceye kadar başka bir özel duruma neden olur.

Bunun yerine, istisnaları günlüğe kaydetmenin daha güvenli bir yoluna geri dönmeniz gerekir. Örneğin, günlükçünüz istisnaları uzak bir sunucuya gönderirse, syslogbunun yerine günlükçideki istisnaları gönderin . Günlüğünüz Windows Events'de istisnalar kaydediyorsa ve bu eylem başarısız olursa, hata istisnasını basit bir metin dosyasında saklayın.

Bunu yaptıktan sonra, bir sonraki soru, bu istisnaların oluştuğunu nasıl bilebilirsiniz: Binlerce sunucuda çalışan düzinelerce uygulamanız varsa, yerel olarak bir şey kaydedip kaydetmediklerini kontrol etmek için her birini düzenli olarak SSH yapamazsınız. .

Bunun bir yolu, bu “istisnai günlükleri” kontrol eden ve bunları diğer istisnaların depolandığı konuma iten bir cron işine sahip olmaktır (sonunda kaydedicinizi kullanarak, ancak sonsuz veya geçici döngülere dikkat edin!).


E-postaya giden istisna günlüğümle aynı sorunu yaşadım. Bir sunucuya bağlanamazsa, korkunç bir sonsuz döngüye girdi. Bunun yerine, Olay Günlüğüne yönlendirmek ve yeni bir bağlantı kurulana kadar yeni e-postaların gönderilmesini engellemek için bir onay işareti koydum.
mgw854

Sanırım önerdiğiniz gibi bir yedek uygulamaya çalışacağız. Jon Raynor'ın uygulamayı (kritik bir günlük durumunda) durdurma önerisi de dikkate almadığımız yollardan biri.
Zairja

Syslog'a gönderilen zaman aşımlarına veya bir dosyaya yazarken G / Ç hatalarına yol açarsanız ne olur? Hatalar sıkışık bir ağdan kaynaklanıyorsa veya disk alanınız tükeniyorsa, sorunu daha da kötüleştirebilirsiniz. Bu tam olarak bütünsel bir çözüm değil; hataları günlüğe kaydetmenin güvenli bir yolu olmayabilir. Çevrim tespiti, üstel geri
çekilme

11

Günlüğe kaydetme uygulamanız için kritikse, günlüğe kaydetme başarısız olursa uygulamayı durdurmanız gerekir.

Kritik değilse, biraz savunmacı olmak, ikincil bir kaynağa günlük / uyarı veren günlük hatalarını işlemek için ikincil bir bileşene sahip olabilir. Ancak bu bile aptalca bir kanıt değildir ve ikincil kayıt cihazı birincil kayıt cihazını izlerken başarısız olursa ne olacağını düşünmeniz gerekir.

İyi bir strateji yerel bir dosyaya giriş yapmaktır ve bu başarısız olursa, olay günlüğündeki başarısızlığı günlüğe kaydetmek, bir e-posta uyarısı oluşturmak, bir veritabanına kaydetmek, vb. disk alanı veya diğer nadir durumlar dışında.

İdeal olarak sessizce başarısız olmanız daha iyi çünkü uygulamayı daha az karmaşık hale getirecektir.

Daha da önemlisi, günlüğe kaydetme hatalarını işlemek için günlüklerin bir 3. tarafın izlenmesi gerekir. Zamanla sağlıklı bir uygulamanın kaç olayı günlüğe kaydettiğini fark edebilmelisiniz. Düşük veya hiç olay kaydetmeye başlamazsa, izleme yoluyla sorunun oluştuğunu görebilir ve bu üçüncü taraf mekanizması aracılığıyla potansiyel olarak uyarı alabilirsiniz.


1
Kritik ve kritik olmayan günlük kaydı arasında ayrım yapmak ve zaman aşımı başına günlük sayısının önemini belirtmek için +1. Yıllardır yedek günlüğü kullanırken bu iki yönü düşünmediğim için hayal kırıklığına uğradım.
Arseni Mourzenko
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.