Bazı kayıt kalıpları ve uygulama günlüğü kayıt kalıpları nelerdir? [kapalı]


66

Son zamanlarda büyük kurumsal uygulamamız için bir alan araştırması yapmak zorunda kaldım. Sorunu bulmak için taramak zorunda kaldığım günlükler yüzünden dehşete düştüm ve günün sonunda günlükler, hatayı tanımlamak / izole etmek için hiç yardımcı olmadı.

Not: Tüm hataların günlükler aracılığıyla keşfedilebilir olmadığını anlıyorum. Bu, günlüklerin korkunç olduğu gerçeğini değiştirmez.

Günlüğe kaydetme ile ilgili olarak düzeltmeye çalışacağımız bazı açık sorunlar var. Bunları burada listelemek istemiyorum ve size günlük dosyalarımızı gösteremem, böylece ne yapmanız gerektiği konusunda öneride bulunabilirsiniz.

Bunun yerine, kayıt cephesinde ne kadar kötü olduğumuzu değerlendirmek için şunu bilmek istiyorum:

  1. Bazı kurallar nelerdir , varsa, bir uygulama için kayıt yapılması, özellikle büyük uygulama söz konusu olduğunda .
  2. Bir düzen var mı biz takip etmelidir ya da anti-desenler biz farkında olmalı?
  3. Bunu düzeltmek için önemli bir şeydir mı yoksa bile düzeltilebilir veya tüm günlük dosyaları basitçe büyük ve bunları analiz etmek tamamlayıcı komut dosyaları gerekiyor?

Not: log4j kullanıyoruz.

Yanıtlar:


55

Uygulamamın yararlı olduğunu kanıtladığı birkaç nokta:

  • Tüm kayıt kodlarını üretim kodunuzda saklayın. Üretimde, tercihen alt sistem başına ve programınızı yeniden başlatmadan daha fazla / daha az ayrıntılı günlük kaydı yapabilme yeteneğine sahip olma.

  • Günlükleri grepgözle ve gözle ayrıştırmayı kolaylaştırın . Her satırın başındaki birkaç ortak alana yapıştırın. Her satırdaki zamanı, ciddiyeti ve alt sistemi tanımlayın. İletiyi açıkça formüle edin. Her günlük mesajının kaynak kod satırına eşlenmesini kolaylaştırın.

  • Bir hata olursa, olabildiğince fazla bilgi toplamaya ve kaydetmeye çalışın. Uzun sürebilir ancak normal işlem zaten başarısız olduğu için sorun yok. Aynı durumun üretimde bir hata ayıklayıcısını eklenmiş olarak olması durumunda beklemek zorunda kalmamak paha biçilemez

Günlükleri izleme ve sorun giderme için çoğunlukla gereklidir. Kendinizi bir sorun gidericinin ayakkabılarına koyun ve yanlış bir şey olduğunda ya da gecenin vakti geldiğinde ne tür bir kütük olması gerektiğini düşünün.


10
Bu cevabı beğendim ancak karar noktalarında hangi seçeneğin yapıldığını kaydetmenin önemli olduğunu da ekleyeceğim. Çok fazla önemsizliğin kaydedildiği ancak kilit kararların kaydedilmediği birçok sistem gördüm. Yani kütüğün% 95'i temelde işe yaramaz. Ayrıca, istek / yanıt tipi sistemler için, istek başına günlük kaydı yapabilmek, alt sistemden daha önemlidir.
Kevin

4
+1. Kendini bir sorun gidericinin yerine koyma konusundaki amacını beğendim. Günlük ifadeleri çok daha kaliteli mesajlar içermeli, daha sonra yaptıklarımızdan sonra ...
c_maker

1
Hata günlüğünün uygulama günlüğünün yanı sıra uygun olay günlüğüne de kaydedilmesi gerektiğine dikkat etmek önemlidir.
Steven Evers

2
@SnOrfus: Günlükleri kaydetmenin birçok yolu vardır, ancak özü, günlük iletilerinin sistemin düştüğü son saniyeye kadar mevcut olması gerektiğidir - bir uçak kara kutu gibi. Herhangi bir tamponlama kullanıyorsanız, her mesajı atlamak / temizlemek için bir seçenek belirtin.
rwong

1
@Rig: Öte yandan, çoğu evde yetiştirilen kayıt cihazı, herhangi bir tamponlama uygulamadı (ve her mesajı güzelce yıkadı), bu da çok düşük performansa yol açtı. Bu yüzden isteğe bağlı yapılması gerekiyor.
rwong

28

Güvenlik açısından kritik gerçek zamanlı sistemler ile çalışıyorum ve kayıt tutma çoğu zaman sürüklenişimi yakalarsanız, dolunayda her 53. Salı günü mavi bir ayda bir kez ortaya çıkan nadir böcekleri yakalamanın tek yoludur. Bu tür bir konuda sizi saplantı haline getirir, bu yüzden ağzınıza köpürmeye başlarsam şimdi özür dilerim. Aşağıdaki yerel kod hata ayıklama günlükleri için yazılmış, ancak çoğu da yönetilen dünya için geçerlidir ...

Metin günlüğü dosyalarını kullanın. Açık görünüyor, ancak bazı insanlar ikili günlük dosyaları oluşturmaya çalışıyorlar: bu çok aptalca çünkü dışarıdayken bir okuyucu aracı aramam gerekmiyor. Ayrıca, eğer metinse ve hata ayıklama ayrıntılıysa, saha mühendisinin dosyayı okuyabilmesi ve problemi bana geri dönmeden teşhis edebilmesi için iyi bir şans var. Herkes kazanır.

Hemen hemen her şeyi kaydedebilecek sistemler tasarlarım, ancak varsayılan olarak her şeyi açmam. Hata ayıklama bilgisi, zaman damgasını taşıyan ve bir liste kutusuna çıkaran gizli bir hata ayıklama iletişim kutusuna gönderilir (silinmeden önce yaklaşık 500 satırla sınırlıdır) ve iletişim kutusu onu durdurmamı, otomatik olarak bir günlük dosyasına kaydetmemi veya yönlendirmemi sağlar ekli bir hata ayıklayıcı. Bu sapma, bazen hayat kurtarıcı olabilen, tamamen seri hale getirilmiş birden fazla uygulamadaki hata ayıklama çıktısını görmeme izin veriyor. Ben kullanılan sayısal günlük düzeylerini (ne kadar yüksek düzeyini ayarlamak, daha yakalamak) kullanmak için:

off
errors only
basic
detailed
everything

ancak bu çok esnek değildir - bir hataya doğru yolunuz üzerinde çalışırken, tonlarca döküntü beklemeden tam olarak neye ihtiyaç duyduğunuza odaklanmanız çok daha etkilidir ve belirli bir işlem veya işlem olabilir. Bu hataya neden olur. Bu her şeyi açmanı gerektiriyorsa, sadece kendi işini zorlaştırıyorsun. Daha ince taneli bir şeye ihtiyacın var.

Şimdi bir bayrak sistemine dayalı olarak günlüğe kaydetmeye geçme sürecindeyim. Kaydedilen her şeyin nasıl bir işlem olduğunu gösteren bir bayrağı vardır ve ne kaydedileceğini tanımlamama izin veren bir dizi onay kutusu vardır. Genellikle bu liste şöyle görünür:

#define DEBUG_ERROR          1
#define DEBUG_BASIC          2
#define DEBUG_DETAIL         4
#define DEBUG_MSG_BASIC      8
#define DEBUG_MSG_POLL       16
#define DEBUG_MSG_STATUS     32
#define DEBUG_METRICS        64
#define DEBUG_EXCEPTION      128
#define DEBUG_STATE_CHANGE   256
#define DEBUG_DB_READ        512
#define DEBUG_DB_WRITE       1024
#define DEBUG_SQL_TEXT       2048
#define DEBUG_MSG_CONTENTS   4096

Bu günlüğe kaydetme sistemi, sürüm oluşturma, açık ve varsayılan olarak dosyaya kaydetme ile birlikte gelir. Hata meydana geldikten SONRA günlüğe kaydetmeniz gerektiğini öğrenmeniz için çok geç, eğer bu hata ortalama olarak her altı ayda bir kez meydana gelirse ve bunu yeniden üretme yönteminiz yoksa. Yalnızca hata ayıklama yapılarıyla çalışan günlükler adildir. sade. aptal.

Yazılım genellikle ERROR, BASIC, STATE_CHANGE ve EXCEPTION açık olarak gelir, ancak bu hata ayıklama iletişim kutusu (veya bunların kaydedildiği yerdeki bir kayıt defteri / ini / cfg ayarı) aracılığıyla alanda değiştirilebilir.

Oh ve bir şey - hata ayıklama sistemim günde bir dosya üretir. Gereksinimleriniz farklı olabilir. Ancak, hata ayıklama kodunuzun her dosyayı çalıştırdığınız kodun tarihi, sürümü ve mümkünse müşteri kimliği, sistemin konumu veya ne olursa olsun ile başlattığından emin olun . Alandan gelen günlük kayıtların bir karışımını elde edebilirsiniz ve sistemin gerçekte nerelerde ve hangi sürümde çalıştıklarını kaydeden kayıtlara ihtiyacınız var ve müşteriye güvenemezsiniz. / field engineer size hangi sürüme sahip olduklarını söylemesi için - sadece hangi sürüme sahip olduklarını söyleyebilirler. Daha kötüsü, diskteki exe sürümünü bildirebilirler, ancak eski sürüm hala çalışıyor çünkü değiştirdikten sonra yeniden başlatmayı unuttular. Kodun sana söylesin.

Son olarak, kodunuzun kendi sorunlarını oluşturmasını istemezsiniz, bu nedenle günlük dosyalarını bu kadar çok gün veya haftadan sonra temizlemek için bir zamanlayıcı işlevi koyun (yalnızca şimdiki zamanla dosya oluşturma zamanı arasındaki farkı kontrol edin). Bu, her zaman çalışan bir sunucu uygulaması için Tamam, başlattığınızda herhangi bir eski veriyi temizleyerek elde edebileceğiniz bir istemci tarafı uygulamasında. Genellikle 30 gün sonra temizleniriz, sık sık mühendis ziyareti olmayan bir sistemde daha uzun süre bırakmak isteyebilirsiniz. Açıkçası bu, günlük dosyalarınızın boyutuna da bağlıdır.


1
+1 Genel olarak mükemmel cevap, ancak özellikle uygulama kimliğini ve sürüm bilgisini günlük dosyasına koymak için, maalesef bu çok sık cevapsız.
İkili Korku

27

Günlüğe kaydetme yönergeleri için en sevdiğim kamu kaynağı Apache JCL Best Practices .

JCL için en iyi uygulamalar iki kategoride sunulmaktadır: Genel ve Kurumsal. Genel ilkeler oldukça açık. Kurumsal uygulamalar biraz daha fazla söz konusudur ve her zaman neden önemli oldukları kadar açık değildir.

Kurumsal en iyi uygulama ilkeleri, "Kurumsal" düzeyde bir ortamda çalıştırılması beklenen ara katman bileşenleri ve araçlara uygulanır. Bu konular Uluslararasılaşma olarak Günlüğe Kaydetme ve hata tespiti ile ilgilidir. İşletmeler daha fazla çaba ve planlama gerektirir, ancak üretim seviyesi sistemlerinde (gerekli değilse) şiddetle teşvik edilir. Farklı kurumsal girişimlerin / ortamların farklı gereksinimleri vardır, bu nedenle esnek olmak her zaman yardımcı olur ...

JCL'yi hedef almasına rağmen, bunlar genel olarak oturum açmak için kabul edilecek kadar genel görünmektedir.

  • Günlüğe kaydetmeyle ilgili kişisel "kurallarım", hata ayıklama düzeyinde, günlüklerimi bir hikaye gibi okumamı sağlamaya çalışıyorum - anlaşılır mantık ve yeterli (ancak aşırı yüklenmemiş) ayrıntılarla.

En ünlü anti-desen muhtemelen "yutma istisnaları" dır - sadece web’de arama yapın.

Büyük günlük dosyaları gelince, benim uygulamada bu çoğunlukla normal bir durumdu. Ve evet, sizin dediğiniz gibi tamamlayıcı komut dosyaları ve / veya Chainsaw gibi aletler de bana normal geliyor.

  • Yukarıda, tüm günlükleri her zaman kör bir şekilde büyük bir dosyaya koymanız gerektiği anlamına gelmez. Bazen günlükleri bazılarını ayrı dosyalara yazmak / kopyalamak faydalı olabilir. Örneğin benim son projemde QA çalışanları metrikler ve zamanlama verileri ve sistem işlemleri hakkında kısa raporlar için özel dosyalar istedi. Bundan faydalanacaklarını ve dev'in faydalanacağını söylediler (kısa raporlardan gerçekten faydalanıldı.

PS. Anti-paternler söz konusu olduğunda, akla gelen diğer kişiler "sel" ve anlamsız mesajlardır.

  • Birçok yinelemeli bir döngüden gelen birden fazla benzer mesajı gördüğümde onu sel olarak adlandırıyorum . Bana göre sel, kaynak kodunda tespit ettiğimde ondan kurtulmaya çalışacak kadar can sıkıcı bir durum. Genellikle onu geliştirmek biraz sanat gerektirir - çünkü, döngü içinde gerçekleşen şeyler ilginç olabilir. Daha derinlemesine geliştirmek için zamanım olmadığında, filtrelemeyi kolaylaştırmak için en azından bu mesajların kayıt seviyesini en düşük seviyeye değiştirmeye çalışıyorum.

  • Anlamsız mesajlar oldukça popüler çöp gibi görünüyor. Bunlar kaynak kodunda okunduğunda zararsız görünüyor - sanırım biri gibi görünen hata ayıklama çıktısını analiz etmenin acısını çekmek zorunda ...

    step #1
    step #2
    step #3
    

    ... içsel çirkinliklerini derinden takdir etmek. Bu tür sorunları kaynak kod düzeyinde tespit etmek için en sevdiğim buluşsal yöntem (meslektaşım tarafından geçmiş projelerimden birinde önerildi), günlüklemede kullanılan string değişmezlerinde yer sembolü oluşum sayısını hesaplamaktır . Tecrübelerime göre, sıfır boşluklar temelde log ifadesinin anlamsız olduğunu garanti eder, bir alan da potansiyel meselenin iyi bir göstergesidir.


4
Selden kaçınmak için genellikle döngünün sezgisel özelliklerini toplarım ve döngünün ardından çıkarım. Döngüde gerçekleşen ilginç bir şey, bir değişkende (benzeri somethingSpecialHappenedCount) saklanmalı ve ardından kaydediciye çıkarılmalıdır.
Spoike

@Spike iyi nokta! Bir değişkende saklamak gerçekten sel baskınlarıyla mücadelede en sevdiğim püf noktalarımdan biri
gnat

1
Tüm farklı sayaçları loger'a, döngü bittikten sonra kolayca karşılaştırabilmeleri için logdaki ASCII tablosu olarak gönderirim. Tablo fikri, Spring'in StopWatch.prettyPrint () işlevinin ürettiği fikirden ilham aldı . Bunun dışında, günlük metninin okunabilir ve konuyla alakalı hale getirilmesi, cevapta daha önce belirtildiği gibi hala bir "sanattır".
Spoike

@Spoike: (ve @gnat) Bu ilginç. Yani temelde sadece giriş yapmak için iş mantığına gerçek kod mu ekliyorsunuz? Bunu daha önce hiç duymamıştım ya da daha önce hiç yapmamıştım ve iş arkadaşlarıma nasıl haklı çıkaracağımı bilmiyorum. Bunu yapmaya başlarsak, geliştiricilerimizden bazılarının kaynak kodunu, iş mantığının kıvrımlı ve okunması zor hale gelene kadar karıştırdığı konusunda korkuyorum. Sadece basitçe bir ifadeyi günlüğe kaydetmek zaten kaynağın çirkin görünmesini sağlıyor.
c_maker

2
@c_maker, logging ile iş mantığını karıştırmak konusundaki amacınız özel bir soruya değer. Şahsen bu konular hakkında henüz güçlü bir fikrim yok. Teoride, AOP ve iirc kullanılarak yapılan bazı ayrıştırma gelişmelerinin hayal edilebileceği gibi, bu yaklaşım için pratik uygulamalar bile vardır. Ancak pratikte "karma" bir yaklaşıma bağlı kaldım ve şu ana kadar bununla ilgili büyük bir sorunum olmadı. Kaynak kodunun dağınıklığı gerçek bir tehlikedir, ancak şimdiye kadar, kayıt kodunu oldukça "barışçıl" bir şekilde bir araya getirmeyi başardım. Bu elbette belirli bir çaba gerektirir.
gnat

11

İstisnayı yalnızca bir kez giriş yapın!

Dikkatimi çektiğim en yaygın acı noktalarından biri, bir istisna kaydedip tekrar taramak. Sonuç olarak, günlük dosyaları birkaç yığın seviyesinde aynı istisnaları birkaç kez içerir.


5

İşte bir anti-pattern: Akla gelebilecek her şeyi izlemek için bir veritabanı tablosunda iki düzine "genel değişken" alan oluşturmak ve ardından farklı günlükler için 88 (ve sayma) farklı enum değerlerine sahip olmak.


+1 - Bunu gördüm. String1, string2, string3, string4, string5 gibi sütunlara sahip "Hata Tabloları", burada tüm sütunların birleştirilmesi belgelerin hiçbirinde referans alınmayan bir hata koduna neden olur. Sonuç, kafa karıştırıcı ve işe yaramaz olan günlük kaydıdır; aynı zamanda "3. parti-işletme-uygulaması-özel-geliştirme-hata ayıklama-cehennemi" olarak da bilinir.
Morgan Herlocker

Benim durumumda "günlüğe kaydetmenin gerçekte ne olduğu hakkında hiçbir fikriniz olmadan elden çıkarılmış kütük sistemi"
Wayne Molina

4

Günlüklerle ilgili deneyimim daha büyük, ancak makineyle filtrelenebilir hale getirecek kadar tutarlı ve uygulamanızın her bileşeni için önem derecesini ayrı ayrı yapılandırabilecek kadar tutarlı olun.

Ayrıca, gelecekteki bir hatayı bulmak için hangi günlüğe kaydetmeye ihtiyacınız olacağını tahmin etmek çok zordur. Hataların kaydedileceği bariz yerlerin çoğu, ürün kapıdan çıkmadan önce sabittir. Bir hata raporunun sonucunun, tekrar ortaya çıkarsa teşhis konmasına yardımcı olmak için günlük eklemiş olmanız nadir değildir.


2

Evin operasyon bölümünden birkaç not:

1) Günlüklerin yerel olarak yapılandırılabilir olduğundan ve tercihen metin editöründen daha ağır olmayan bir araçla yapıldığından emin olun. Çoğu zaman TRACE seviyesindeki günlük kaydı yapmak istemiyoruz, ancak açmayı çok istiyoruz.

2) Mümkünse, günlüklerin bir metin düzenleyiciden daha ağır olmayan bir araçla okunabildiğinden emin olun. Üretim sistemi arızalandığında garip bir saatte bir alet avına çıkmak zorunda kalmaktan daha kötü bir şey olamaz.


1

Web uygulamaları ile çalışma tecrübelerime göre:

(ve depolama göz önüne alındığında günümüzde çok ucuz)

  • Kullanabildiğiniz kadar (şu anda) bilgiyi mümkün olduğunca giriş yapın.
  • Ben her zaman DateTime.Now günlüklerimi ekliyorum.
  • Her zaman (eğer mümkünse) belirli bir "işlem" in zaman-giriş günlüğünü tutarım.
  • Günlük dizelerinizle tutarlı olun. Her zamandan beri bu tür bir kalıp kullanıyorum:

    • "[Bilgi X] [Bilgi Y] [Bilgi Z] [vb]"

1

İstifleme dışında mevcut uygulama durumunu ve girişi kaydedin.

Yazılım belirleyicidir, bu ikisi genellikle hatayı yeniden oluşturmak için ihtiyacınız olan tek şeydir. Tam durumun saklanması bazı durumlarda zahmetli olabilir, bu nedenle mevcut durumu çoğaltmanın yolları, örneğin önceki girdiler de iyidir.

Elbette daha fazla veri her zaman daha iyidir ancak en azından bu ikisi en kolay kazalar için iyi bir başlangıçtır.


3
"Yazılım belirleyicidir" => her zaman ne yazık ki değil. Örneğin eşzamanlılık hataları düşünün.
assylias
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.