Kayıt için kurallar ve tavsiyeler?


13

Kuruluşumda, günlüğe kaydetmeyle ilgili olarak ekleyebileceğiniz veya yorum yapıp yapamayacağınızı bilmek istediğim bazı kurallar / guildeline'lar hazırladık.

Java kullanıyoruz ancak genel olarak loggin - kurallar ve tavsiyeler hakkında yorum yapabilirsiniz

  1. Doğru günlük kaydı düzeyini kullanma

    • HATA: Bir şeyler çok yanlış gitti ve hemen düzeltilmesi gerekiyor
    • UYARI: İşlem sabitlenmeden devam edebilir. Uygulama bu seviyeye tolerans göstermelidir, ancak uyarı daima araştırılmalıdır.
    • BİLGİ: Önemli bir sürecin bittiğine dair bilgiler
    • DEBUG. Sadece geliştirme sırasında kullanılır
  2. Ne günlüğe kaydettiğinizi bildiğinizden emin olun.

  3. Günlüğe kaydetmenin uygulamanın davranışını etkilemesinden kaçının

Günlüğe kaydetmenin işlevi, günlüğe ileti yazmak olmalıdır.

  1. İşlem kaydı iletileri açıklayıcı, açık, kısa ve öz olmalıdır.

Sorun giderme sırasında saçma bir mesaj çok fazla kullanılmıyor.

  1. Log4j'ye doğru özellikleri koyun

Doğru yöntem ve sınıfın otomatik olarak yazıldığını girin.

Misal:

Tarihli -web

log4j.rootLogger=ERROR, DATEDFILE
log4j.logger.org.springframework=INFO
log4j.logger.waffle=ERROR
log4j.logger.se.prv=INFO
log4j.logger.se.prv.common.mvc=INFO
log4j.logger.se.prv.omklassning=DEBUG

log4j.appender.DATEDFILE=biz.minaret.log4j.DatedFileAppender
log4j.appender.DATEDFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATEDFILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}.%M] - %m%n

log4j.appender.DATEDFILE.Prefix=omklassning.
log4j.appender.DATEDFILE.Suffix=.log
log4j.appender.DATEDFILE.Directory=//localhost/WebSphereLog/omklassning/
  1. Günlük değeri.

Lütfen uygulamadaki değerleri günlüğe kaydedin.

  1. Günlük öneki.

Uygulamanın hangi kısmının, günlüklemenin tercihen proje üzerinde anlaşılan önek için bir şeyle yazıldığını belirtin; PANDORA_DB

  1. Metin miktarı.

Çok fazla günlük metni olmamasına dikkat edin. Uygulamanın performansını etkileyebilir.

  1. Kayıt formatı:

-Log4j ile kullanılacak çeşitli varyantlar ve yöntemler vardır, ancak istisnalarda oturum açtığımızda aşağıdaki formatın aynı şekilde kullanılmasını istiyoruz:

logger.error("PANDORA_DB2: Fel vid hämtning av frist i TP210_RAPPORTFRIST", e);

Yukarıdaki örnekte, sınıfı ve yöntemi otomatik olarak yazacak şekilde log4j özelliklerini ayarladığımız varsayılmaktadır.

Her zaman günlükçüyü kullanın, aşağıdakileri değil:

System.out.println(), System.err.println(), e.printStackTrace()

Web uygulaması çerçevemizi kullanıyorsa, işleyicide try-catch kullanıyorsanız ve yukarıdaki modele göre günlük kaydediyorsanız, EJB'den çok ayrıntılı hata bilgileri alabilirsiniz:

Projemizde, yöntem ve sınıf adlarının otomatik olarak yazıldığı bu dönüşüm modelini kullanıyoruz. Burada konsol ve tarihli filipon için iki farklı pattent kullanıyoruz:

log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.appender.DATEDFILE.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

Yukarıdaki örneklerde hem yöntem hem de sınıf yazılır. Konsolda sıra numaramız da yazılacaktır.

  1. toString()

Lütfen toString()her nesne için bir tane bulundurun. EX:

@Override
public String toString() {
  StringBuilder sb = new StringBuilder();
  sb.append(" DwfInformation [ ");
  sb.append("cc: ").append(cc);
  sb.append("pn: ").append(pn);
  sb.append("kc: ").append(kc);
  sb.append("numberOfPages: ").append(numberOfPages);
  sb.append("publicationDate: ").append(publicationDate);
  sb.append("version: ").append(version);
  sb.append(" ]");
  return sb.toString();
}

bu çıktıları yapan özel yöntem yerine

public void printAll()
{
    logger.info("inbet: " + getInbetInput());
    logger.info("betdat: " + betdat);
    logger.info("betid: " + betid);
    logger.info("send: " + send);
    logger.info("appr: " + appr);
    logger.info("rereg: " + rereg);   
    logger.info("NY: " + ny);   
    logger.info("CNT: " + cnt);   
}

Peki bu günlüğe kaydetme yöntemlerini kullanarak ekleyebileceğiniz, yorumlayabileceğiniz veya şüpheli bulabileceğiniz bir şey var mı? Java, Java ve log4j ile ilgili olmasa bile yanıtlamaktan veya yorum yapmaktan çekinmeyin.



1
@gnat - Bence haklısın, iki soru arasında çok fazla çakışma var. Yine de yinelenen bir şey demeye çalışıyorum.

Yanıtlar:


4

Günlüğe kaydetme kuralınızın, günlük deyiminin nereden geldiğini uygulama uzantısı olarak, modül düzeyinde günlük işaretleme bayraklarını eklemek isteyebilirsiniz. Bu, her zaman her şeyi günlüğe kaydetmek yerine, uygulamanızın bölümlerini seçerek hedeflemenizi sağlar. Burada ek yük var ve bu günlüğü etkinleştirmenizi / devre dışı bırakmanızı sağlayan bir tesis oluşturmanız gerekiyor. İdeal olarak, uygulama çalışırken anında etkinleştirebilir / devre dışı bırakabilirsiniz.

Hata ayıklamanın altında "İz" olarak adlandırdığım bir katmanı görmeye alışkınım, ancak bu evrensel bir terim olmak zorunda değil. Modül giriş / çıkışı, giriş / çıkışlı zaman damgaları ve geçirilen değerleri yakalamak için bonus puanlar dahil olmak üzere, mümkün olan en yüksek düzeyde izleme günlükleri izler. Açıkçası, bu çok fazla veri üretir ve bu willy-nilly'yi açtığınız bir şey değildir. Ancak, sürece ekleyemediğinizde veya hatalı uygulamanın temel bir dökümü olmadığında hata ayıklama açısından avantajları vardır.

Günlük bilgilerimle dosya / modül referanslarını ve zaman damgalarını görmek istiyorum. İş parçacıkları arasındaki yarış koşullarını avlamaya çalışırken ve uygulamanın birden çok alanının faaliyetlerini koordine ederken kullanışlı olabilir. Adil olmak gerekirse, bu ayrıntıların günlük dosyasına karıştığını düşünen bazı halkları biliyorum. Zaman damgasını eklemek ekiple tartışmak için bir şeydir. (Log4j zaten bunu yaparsa özür dileriz.)

Günlüğe kaydetme kendi iş parçacığı / işlemi tarafından halledilmiyorsa, bu da dikkate alınması gereken bir şeydir. Uygulama iş parçacığının günlüğün işlenmesi için beklemesini sağlamak yerine, günlük iletisi günlük işleyicisine iletilir ve uygulama iş parçacığı neşeli yoluna gider. Alternatif olarak, günlük mesajlarını işlemek için bir çeşit tampon mekanizması oluşturmak, uygulamanın yanıt vermesini hızlandırmanın başka bir yoludur.

Günlük dosyalarının boyutu ve geçmişi üzerinde denetimlere sahip olmak dikkate alınması gereken bir diğer özelliktir. Uygulamanın ana bilgisayar sistemindeki tüm disk alanını boşaltmasını istemiyorsunuz veya tüm günlük dosyalarını sonsuza kadar saklamak istemiyorsunuz.


2

Akılda tutulması gereken bir şey, günlük kaydı için herhangi bir dize işlemi yapmadan önce günlük düzeyini kontrol etmektir. Yani, gerçekten günlüğe kaydetmeyecekseniz, bir tarih biçimlendiricisi kurma veya bir dizi dizeyi birleştirme işlemine gitmeyin. Bu sadece uygulamanızı yavaşlatan boşa giden bir iş.

FYI, Apache Commons projesi yöntemlerinizi oluşturmayı kolaylaştıran bir ToStringBuilder sınıfa sahiptir toString().


1

Buraya eklediğinizde şüpheli bir şey bulamıyorum Nick. Bir süredir böyle yapıyorum. Sağladığınız gönderi çok ayrıntılı ve muhtemelen günlük kaydı için bir tür öğretici olarak kullanılabilir. Ancak, burada, bir şey eklemek istiyorum: Birçok yerde, ben koşullu günlüğü kullanarak ahbap görüyorum, örneğin:

     if(env_local)
     {
     write_to_local();
     }    
     else if(env_IT)
     {
     write_to_IT();
     } 
     else if(env_PROD)
     {
     write_to_prod();
     } 
     else
     dosomething();

Bu tür koşullu izleme veya hata ayıklamanın en iyi yol olmadığını düşünüyorum.


1

Hatayı oluşturan Sınıf / Yöntem günlüğüne ek olarak, bu yönteme iletilen parametrelerin günlüğe kaydedilmesi de yararlı olacaktır. Bir hatanın nerede ortaya çıktığını bilmek, 1000'den sadece 1 kez oluştuğunda çok yararlı değildir; hatanın oluşmasına neden olan verileri de bilmeniz gerekir.

Ayrıca, bir uygulama için günlük kaydı varsayılan düzeyini tanımlayan bir değişkene sahip buldum. Bu şekilde, UYARI ve HATA kodunun yanında DEBUG ve INFO kodunuz olabilir. Üretim modunda çalışırken, varsayılan olarak DEBUG bilgilerini vermeyeceksiniz, ancak bir hata görüntülendiğinde bir bayrağı güncelleyebilir ve DEBUG iletilerini günlüğe yazmaya başlayabilirsiniz.


1

Günlüğe kaydetme çoğu zaman kesişen bir konudur. Yalnızca Java, günlük kaydını gerçek iş mantığınızdan ayırabilmeniz için yeterli değildir. Bu, örneğin bir yöntemi alıp başka bir projeye yerleştiremeyeceğiniz anlamına gelir, ancak bunu yapmadan önce tüm günlük kayıtlarınızı kaldırmanız ve ayarlamanız gerekir. Ve bu buzdağının sadece görünen kısmı.

Günlüğe kaydetme ve "gerçek" iş mantıklarını karıştırırken bu ve diğer sorunları önlemek için en boy yönelimli programlama kullanmayı düşünmelisiniz. Java için en çok kullanılan çerçeve AspectJ olacaktır. AspectJ ve oldukça iyi günlüğü ötesinde kullanımlarını açıklayan google teknik görüşmelerden bu youtube video var . Burada elbette stackexchange'te kendinizi kaydetmek için birçok örnek bulacaksınız .


0

I-cekti önermek bir şey, herhangi bir belirli günlük dosyası ile ilişkili birden çok günlüğü bağlamı olması için bir araç olması ve herhangi bir günlüğü bağlamında yazılı bir şey açıkça açıkça günlük içeriğini bağlamını atmak için sorma sürece günlük almak olacak şekilde düzenlemek olacaktır . Böyle bir tasarım, bir işlem sırasında oldukça ayrıntılı günlükleri yakalamaya ve işlem başarılı olursa onları atmaya izin verir, ancak işlem başarısız olursa bunları kullanılabilir hale getirir. Böyle bir günlük kaydı özelliği olmadığında, bir şey başarısız olduğunda iyi günlüklerin bulunması, bir uygulamanın her şeyin çalıştığı zamanların% 99.99'unda gereksiz verileri günlüğe kaydetmek için çok fazla zaman harcamasını gerektirebilir.

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.