Java.util.logging kullanarak iyi örnekler [kapalı]


273

Programımda günlükleri kullanmak istiyorum. Java.util.logging'i duydum ama nasıl başlayacağımı bilmiyorum.

Günlüğe kaydetme ile neler yapabileceğime dair örnekler var mı? Günlük kaydını kendi programımda nasıl kullanırım?


7
Buradan başlayabilirsiniz: slf4j.org/manual.html
Jeremy

1
Steven Vascellaro'ya katılıyorum. Konu polisliği pratik bir amaçla sona erdiğinden yok edilen yararlı eşyaları görmekten bıktım. Ayrıca, java.util.logging hakkında OP'nin sorduğu gibi Jeremy ile saygılı bir şekilde aynı fikirde değilim. Ayrıca yerel günlük kaydıyla da ilgileniyorum (cevap için teşekkürler, grwww!)
NOP

Bir satırdaki verileri günlüğe kaydetmek için: log.log (Level.INFO, "Mesajım {0}", yeni Object [] {myDataId});
Mitja Gustin

Yanıtlar:


335

java.util.logging uygulamanızla birlikte bir kavanoz dosyası daha tote yapmak zorunda kalmaz ve iyi bir Formatter ile iyi çalışır.

Genel olarak, her sınıfın en üstünde :

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

Ardından, Logger sınıfının çeşitli olanaklarını kullanabilirsiniz .


En yüksek yürütme akışı düzeyinde hata ayıklayanLevel.FINE herhangi bir şey için kullanın :

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

Döngülerin içinde Level.FINER/ Level.FINESTiçinde ve temel akış sorunlarını ayıklarken her zaman bu kadar ayrıntı görmeniz gerekmeyecek yerlerde kullanın :

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

GC'nin takip etmesi gereken tonlarca String birleştirme çöpü üretmekten kaçınmak için kayıt tesislerinin parametreli versiyonlarını kullanın. Object[]Yukarıdaki gibi ucuz, genellikle yığın tahsisi.


İstisna işleme ile her zaman istisna ayrıntılarının tamamını kaydedin:

try {
    ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log( Level.SEVERE, ex.toString(), ex );
}

Buraya her zaman ex.toString()mesaj olarak geçiyorum, çünkü o zaman günlük dosyalarında " grep -n" için " Exception" yazdığımda mesajı da görebiliyorum. Aksi takdirde, yığın dökümü tarafından üretilen bir sonraki çıkış satırında olacak ve bu çizgiyle eşleşmesi için daha gelişmiş bir RegEx'e sahip olmalısınız, bu da genellikle bakmanız gerekenden daha fazla çıktı alır.


3
Bu bir tür dosyaya yazıyor mu? Henüz programımda çalıştıramadım. Sahip olduğunuz ilk hatta sahibim ama şimdiye kadar hiçbir şey yapılmadı.
Doug Hauf

5
Günlükleri nasıl görüntülüyorsunuz? .fine()
Kullandığım

7
1998'den beri Java'da program yapıyorum. Java'da oturum açmanın her zaman olması gerekenden çok daha fazla bir baş ağrısı olduğunu gördüm. Bu, okuduğum Java'ya nasıl giriş yapılacağına dair en açık açıklamadır. Özlü.
Steve McLeod

30
Hiç kimsenin günlük dosyalarını bulabileceği ilginç değildir.
Ahmedov

4
Günlüklerin nereye gittiğini merak ediyorsanız, Kaydedici için bir İşleyici ayarladığınızdan emin olun. Günlükleri konsola göndermek için yeni bir ConsoleHandler kullanın ve bunu addHandler yöntemini kullanarak günlükçünüze ekleyin. Hem kayıt cihazında hem de işleyicide setLevel'i çağırdığınızdan emin olun.
Craig Brown

67

Kaydediciyi şu şekilde beyan etmelidir:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

böylece sınıf isminizi yeniden düzenlerseniz izler.

Burada java logger hakkında bir makale yazdım .


53

Günlüğe kaydetme için birçok örnek ve farklı türler vardır. Java.util.logging paketine bir göz atın .

Örnek kod:

import java.util.logging.Logger;

public class Main {

  private static Logger LOGGER = Logger.getLogger("InfoLogging");

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

Sınıf adını sabit kodlamadan :

import java.util.logging.Logger;

public class Main {
  private static final Logger LOGGER = Logger.getLogger(
    Thread.currentThread().getStackTrace()[0].getClassName() );

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

15
Günlük adını neden olarak ayarlamıyorsunuz Main.class.getSimpleName()? Bu şekilde yeniden düzenleme aracı gerektiğinde düzgün bir şekilde değiştirecek ve yine de ikinci çözümünüz kadar hantal değil.
Pijusn

3
Kaydedici adı için yığın izleme yapmak kesmek, yavaş ve alışılmadık bir işlemdir. Ayrıca kırılacak ve AOP proxy'leri veya diğer bayt kodlama sıra dışı için garip isimler verecektir.
Adam Gent

9
Stacktrace işi için -1. Yavaştır ve derleyici optimizasyonlarını engeller.
phooji

4
Kaydediciyi başlatırken neden "yavaşlık" hiç önemli olmaz? Yavaşlık sözleri çoğu insanın erken optimizasyon olarak adlandırdığı şeydir (Evet, kod biraz hack gibi görünüyor).
mikkom

3
@AndrewMcKinlay Hangi durumda bir şey kırıyor? Logger etiketinin sınıf adıyla aynı olması gerekiyorsa, bunu yapmak gayet iyi görünüyor. Yeniden kodlama araçları otomatik olarak yeniden adlandırılacak, sabit kodlu bir dize ise yeniden düzenleme aracı atlayabilir veya "Bunu da yeniden adlandırmak istiyor musunuz?" Diyebilir.
Mayıs, Pijusn

23

SLF4J, Apache Commons Logging'den (ACL) daha iyi bir loglama cephesidir. ACL, Log4J veya Java Util Logging'e doğrudan çağrı yapan SLF4J üzerinden diğer günlük kaydı çerçeveleriyle köprüler vardır, böylece tek bir günlük yapılandırma dosyasıyla tüm çıktıları tek bir günlük dosyasına yönlendirebilirsiniz. Uygulamanız neden birden çok günlük çerçevesi kullanıyor? Çünkü kullandığınız 3. taraf kütüphaneleri, özellikle de daha eski kütüphaneler muhtemelen kullanmaktadır.

SLF4J çeşitli kayıt uygulamalarını destekler. Her şeyi çıktıya alabilir, Log4J veya Logback kullanabilir (Log4J üzerinden önerilir).

http://www.slf4j.org/

http://logback.qos.ch/


9

Şahsen minlog kullanırdım . Günlük kaydı sınıfı birkaç yüz satır kod olduğu için son derece basittir.


3
Çok az yer kaplaması için, bu seçilecek kütüphane.
h3xStream

0

Apache'nin ortak günlük kaydı yardımcı programını kullanmanızı öneririm. Oldukça ölçeklenebilir ve farklı günlükler için ayrı günlük dosyalarını destekler. Buraya bakın .


11
İyi öneri! yine de istediklerini cevaplamaya çalışın, aksi takdirde sadece bir yorum bırakın;)
Ordiel
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.