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?
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?
Yanıtlar:
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.FINEST
iç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.
.fine()
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");
}
}
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.
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).
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 .