Tuesday 30 March 2010

SLF4J

SLF4J, java.util.logging, log4j ve logback gibi loglama altyapılarının abstract edilmesi için kullanılan bir kütüphanedir. Uygulamaların hangi loglama altyapısını kullanacaklarına kurulum sırasında karar verilmesine imkan tanır.

Logger Nesnesi
--------------------------------------------------------------------------------
Geliştirilen Java sınıfında loglama yapmak için kullanılacak olan logger nesnesi, SLF4J tarafından sağlanan LoggerFactory sınıfı yardımıyla tanımlanır. Logger nesnesinin ismi tanımlama esnasında belirlenir:
Logger logger = LoggerFactory.getLogger("Test");

Loglama Seviyeleri
--------------------------------------------------------------------------------
SLF4J kullanılarak loglanacak olaylar, kritiklik derecelerine göre 5 ayrı kategoride değerlendirilir:
ERROR Uygulamanın sonlanmasına yol açacak olanlar dahil, çalışma sırasında alınan hataların loglanması için kullanılan seviyedir.
WARN Hata olmamakla birlikte, beklenmeyen ya da istenmeyen olarak nitelendirilebilecek durumlarda kullanılır.
INFO Çalışmanın başlangıcı veya bitişi gibi olayların, bilgi amaçlı loglanmasına yardımcı olan seviyedir.
DEBUG Detaylı bilgi edinme amaçlı kullanılan seviyedir.
TRACE Çok detaylı bilgi edinme amaçlı kullanılan seviyedir.


Loglama
--------------------------------------------------------------------------------
Loglama işlemi, kullanılabilecek loglama seviyelerine karşılık gelen ve parametre de içerebilen metodlar yardımıyla yapılır. Parametre desteği için "{}" dizisi ile birlikte bir nesne koleksiyonu kullanılır. "{}" dizilerinin sırası, parametrenin ilgili nesne koleksiyonundaki indeksine karşılık gelir:
logger.warn("Güncelleme işlemi sırasında {} ID'li olay için {} tane uyarı alınmıştır.", new Object[] {eventID, new Integer(warningCount)});

Yukarıdaki örnekte, WARN seviyesinin etkin olduğu durumda, ilk "{}" dizisi yerine eventID, ikinci "{}" dizisi yerine ise warningCount parametresi getirilecek ve elde edilen yeni dizi loglanacaktır. Loglanacak dizinin elde edilmesi için parametrelerin yerleştirilmesi işlemi, sadece WARN seviyesinin etkin olduğu durumda gerçekleştirileceğinden, bu seviyenin kapalı olduğu zamanlarda ekstra bir yük getirmeyecek ve uygulamanın performansına olumsuz bir etki yapmayacaktır.

MDC (Mapped Diagnostic Context)
--------------------------------------------------------------------------------
MDC, loglama işlemleri sırasında thread özelinde değişken tanımlamak ve tanımlanan değişkenleri yöneterek loglamaya katkıda bulunmak amacıyla geliştirilmiş bir mekanizmadır. MDC sınıfının statik metodları olan put ve get yardımıyla yönetilen değişkenler, kullanılacak loglama altyapısının konfigürasyonda kullanılan "%X{[değişken adı]}" dizisi ile birlikte, thread özelinde loglama yapmaya imkan tanır:
Loglama İşlemi Loglama Altyapısı Konfigürasyonu (Log4j) Log Çıktısı

MDC.put("userName", "admin");
logger.info("Olay tanımı yapıldı");

admin -- Olay tanımı yapıldı

Yukarıdaki örnekte, MDC ile tanımlanmış "userName" değişkeni, Log4j konfigürasyonunda belirtilen "%X{userName}" dizisi yardımıyla, loglanan bütün olayların içeriğine otomatik olarak dahil edilmiştir.


Konfigürasyon
--------------------------------------------------------------------------------
SLF4J mevcut loglama altyapılarının abstract edilmesi için kullanıldığından özel bir konfigürasyon dosyasına ihtiyaç duymamaktadır. Bunun yanında, SLF4J desteğinin kullanılabilmesi için uygulamanın classpath içeriğinde, SLF4J API tanımlarını barındıran jar dosyasının yanında, ilgili loglama altyapısı için özelleştirilmiş SLF4J jar dosyasının da bulunması gerekmektedir. Örneğin, SLF4J'in log4j altyapısı ile birlikte kullanıldığı durumda classpath içeriğinde slf4j-api.jar, slf4j-log4j.jar ve log4j.jar dosyaları yer almalıdır.