Logging: Log4j ve SLF4J ile Uygulama Kayıtları Tutma

crazy_coder

Moderatör
Katılım
20 Şub 2026
Mesajlar
204
Tepkime puanı
0
Puanları
16
Logging: Uygulamanın Kara Kutusu



1. Neden Sout Yerine Logging Kullanmalıyız?​


Log Seviyeleri: Sadece kritik hataları mı yoksa her adımı mı görmek istediğinizi tek bir ayarla seçebilirsiniz.

Hedef Belirleme: Kayıtları sadece konsola değil; dosyalara, veritabanına veya uzak sunuculara (ELK Stack vb.) gönderebilirsiniz.

Performans: Loglama sistemleri asenkron çalışabilir, böylece uygulamanızı yavaşlatmaz.

Formatlama: Log mesajlarına otomatik olarak tarih, saat, sınıf adı ve işlemci (Thread) bilgisini ekler.

2. Log Seviyeleri: Hangisini Ne Zaman Kullanmalı?​


Loglama hiyerarşisi, mesajın önem derecesine göre şekillenir:

SeviyeKullanım Amacı
ERRORUygulamanın bir kısmının çökmesine neden olan ciddi hatalar.
WARNBeklenmedik durumlar, henüz hata değil ama risk teşkil ediyor.
INFOSistemin normal işleyişine dair önemli olaylar (Uygulama başladı, sipariş alındı).
DEBUGGeliştiriciler için detaylı teknik bilgiler (Hangi parametre gönderildi).
TRACEEn detaylı kayıt seviyesi, adım adım iz sürme.

3. SLF4J ve Log4j Birlikteliği​


SLF4J (Simple Logging Facade for Java): Bir "cephe" (facade) görevi görür. Kodunuzu doğrudan bir log kütüphanesine bağlamaz. Yarın Log4j yerine Logback kullanmak isterseniz kodunuzu değiştirmeniz gerekmez.

Log4j 2: Mesajların nereye ve nasıl yazılacağını belirleyen, arka planda işi yapan asıl "motor"dur.

Kod Örneği:​

Java:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SiparisServisi {
// Logger tanımı
private static final Logger logger = LoggerFactory.getLogger(SiparisServisi.class);

public void siparisIsle(int id) {
    logger.info("Sipariş işleme alındı. ID: {}", id); // {} kullanımı performansı artırır
    
    try {
        // işlemler...
    } catch (Exception e) {
        logger.error("Sipariş işlenirken hata oluştu! ID: {}", id, e);
    }
}

}

4. Log4j Yapılandırması (log4j2.xml)​


Logların nereye yazılacağını bir XML veya YAML dosyasıyla belirlersiniz. Örneğin, logları hem konsola hem de günlük olarak değişen (Rolling) bir dosyaya yazdırabilirsiniz.

XML:
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="MyFile" fileName="logs/app.log">
<PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="MyFile"/>
</Root>
</Loggers>
</Configuration>

5. Logging Best Practices​


Parametreli Mesajlar: logger.debug("Veri: " + data) yerine logger.debug("Veri: {}", data) kullanın. Bu, string birleştirme maliyetini engeller.

Hassas Veriler: Loglara asla şifre, kredi kartı numarası veya kişisel verileri (KVKK/GDPR gereği) açıkça yazmayın.

Anlamlı Mesajlar: "Hata oluştu" yerine "Kullanıcı ID 5 için veritabanı bağlantısı koptu" gibi spesifik bilgiler verin.



Sonuç

Logging, karanlıkta fenerle yürümek gibidir. İyi yapılandırılmış bir loglama sistemiyle, bir hata oluştuğunda müşterinizden önce sizin haberiniz olur ve hatanın kaynağını saniyeler içinde bulabilirsiniz.
 
Geri
Üst