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:
| Seviye | Kullanım Amacı |
|---|---|
| ERROR | Uygulamanın bir kısmının çökmesine neden olan ciddi hatalar. |
| WARN | Beklenmedik durumlar, henüz hata değil ama risk teşkil ediyor. |
| INFO | Sistemin normal işleyişine dair önemli olaylar (Uygulama başladı, sipariş alındı). |
| DEBUG | Geliştiriciler için detaylı teknik bilgiler (Hangi parametre gönderildi). |
| TRACE | En 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.