Gereksinimler ve Ön Hazırlık
Log4j kullanmaya başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 standartlarına göre, projenizde Java 17 veya üzeri bir sürümün kullanılması önerilir. Bağımlılık yönetimi için Maven veya Gradle kullanmak, kütüphane sürümlerini yönetmeyi kolaylaştırır.
Aşağıdaki araçların sisteminizde kurulu olması gerekmektedir:
- JDK 17 veya daha güncel bir sürüm.
- Apache Maven veya Gradle.
- Bir IDE (IntelliJ IDEA, Eclipse veya VS Code).
Projenize Log4j 2 bağımlılıklarını eklemek için Maven pom.xml dosyanıza şu yapılandırmayı dahil etmelisiniz:
org.apache.logging.log4j
log4j-api
2.24.1
org.apache.logging.log4j
log4j-core
2.24.1
Bu bağımlılıklar, Log4j'nin çekirdek motorunu ve API arayüzlerini projenize dahil eder. Sürüm numaralarını her zaman Apache'nin resmi sitesinden kontrol ederek en güncel stabil sürümü kullandığınızdan emin olun.
Log4j Konfigürasyonu: log4j2.xml Dosyası
Log4j'nin en güçlü yanı, kodunuzu değiştirmeden günlükleme seviyelerini veya hedeflerini değiştirmenize izin veren XML veya JSON tabanlı konfigürasyon dosyalarıdır. src/main/resources dizini altında log4j2.xml adında bir dosya oluşturarak işe başlayın.
Aşağıdaki örnek, günlükleri hem konsola hem de bir dosyaya yazan temel bir yapılandırmadır:
Bu yapılandırma, info seviyesindeki ve üzerindeki tüm logları hem konsola hem de logs/uygulama.log dosyasına kaydeder. PatternLayout içindeki ifadeler, log mesajının zaman damgası, iş parçacığı (thread) adı ve hata seviyesi gibi bilgileri içermesini sağlar.
Java Kodunda Log4j Kullanımı
Konfigürasyon tamamlandıktan sonra, Java sınıflarınız içerisinde Logger nesnesini tanımlayarak günlükleme yapmaya başlayabilirsiniz. Her sınıf için ayrı bir logger tanımlamak, logları filtrelerken hangi sınıftan geldiğini anlamanızı kolaylaştırır.
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class UygulamaServisi {
private static final Logger logger = LogManager.getLogger(UygulamaServisi.class);
public void islemYap(String veri) {
logger.info("İşlem başlatıldı: {}", veri);
try {
// İş mantığı kodları
} catch (Exception e) {
logger.error("Bir hata oluştu: ", e);
}
}
}
Yukarıdaki örnekte, logger.info metodu ile bilgilendirme mesajları, logger.error metodu ile ise hata detayları kaydedilir. {} kullanımı, mesajın performanslı bir şekilde oluşturulmasını sağlayan "placeholder" (yer tutucu) mekanizmasıdır.
Log Seviyelerini Anlamak ve Yönetmek
Log4j, günlüklerin önem derecesine göre sınıflandırılmasına izin verir. Bu seviyeler, üretim ortamında (production) gereksiz log kalabalığını önlemek için kritiktir.
| Seviye | Açıklama |
|---|---|
| TRACE | Çok detaylı, hata ayıklama için kullanılır. |
| DEBUG | Geliştirme aşamasında akışı izlemek için kullanılır. |
| INFO | Uygulamanın normal akışını belirten genel mesajlar. |
| WARN | Potansiyel sorunları belirten uyarılar. |
| ERROR | Uygulamanın çalışmasını engelleyen hatalar. |
Üretim ortamında genellikle INFO veya WARN seviyesi tercih edilirken, geliştirme ortamında DEBUG seviyesi aktif edilir.
Performans ve Güvenlik Uyarıları
Kritik Uyarı: Log dosyalarına asla kullanıcı şifreleri, kredi kartı bilgileri veya kişisel verileri (KVKK kapsamındaki veriler) açık metin olarak yazdırmayın. Ayrıca, kullanıcıdan alınan verileri doğrudan log mesajına eklemek, "Log Injection" saldırılarına zemin hazırlayabilir. Verileri her zaman temizleyerek (sanitize) kaydedin.
Log4j kullanırken performans kaybını önlemek için "Async Logger" (Asenkron Günlükleyici) kullanmanız önerilir. Bu, log yazma işleminin ana iş parçacığını bloklamadan arka planda yapılmasını sağlar.
Bu yapılandırma, uygulamanızın loglama süreci nedeniyle yavaşlamasının önüne geçer.
Sıkça Sorulan Sorular
Log4j ile Log4j 2 arasındaki fark nedir?
Log4j 2, orijinal Log4j'nin tamamen yeniden yazılmış halidir. Daha iyi performans, asenkron günlükleme desteği ve daha esnek konfigürasyon seçenekleri sunar. 2026 itibarıyla eski Log4j 1.x sürümleri güvenlik açıkları nedeniyle kesinlikle kullanılmamalıdır.
Log dosyalarım çok büyüyor, ne yapmalıyım?
RollingFileAppender kullanarak log dosyalarınızın belirli bir boyuta ulaştığında arşivlenmesini ve yeni bir dosyaya yazılmasını sağlayabilirsiniz. Bu, disk dolmasını engellemek için standart bir pratiktir.
Log seviyesini kod değiştirmeden nasıl değiştiririm?
log4j2.xml dosyasındaki level değerini değiştirmeniz yeterlidir. Uygulamanızın çalışma anında (runtime) bu dosyayı izlemesini sağlayarak (monitorInterval özelliği ile) yeniden başlatma gerektirmeden log seviyelerini güncelleyebilirsiniz.
Log4j güvenli mi?
Log4j 2, güncel sürümleriyle oldukça güvenlidir. Ancak, bağımlılıklarınızı her zaman güncel tutarak bilinen güvenlik açıklarından (CVE) korunmanız gerekir. Özellikle kütüphane sürümlerini düzenli olarak kontrol edin.
Farklı sınıflar için farklı log seviyeleri tanımlayabilir miyim?
Evet, bölümünde şeklinde belirli paketler veya sınıflar için özel seviyeler tanımlayabilirsiniz.
Log4j ile Asenkron Günlükleme (Asynchronous Logging)
Yüksek trafikli uygulamalarda, günlükleme işlemleri (I/O operasyonları) uygulamanın ana iş parçacığını (main thread) yavaşlatabilir. Log4j 2, bu sorunu aşmak için LMAX Disruptor kütüphanesini kullanarak asenkron günlükleme desteği sunar. Bu yapılandırma, log mesajlarını bir kuyruğa alarak ana iş parçacığını bekletmeden devam etmesini sağlar.
Asenkron günlüklemeyi aktif etmek için log4j2.component.properties dosyasına şu satırı eklemeniz yeterlidir:
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
Ayrıca, projenize disruptor-x.x.x.jar kütüphanesini eklemeyi unutmamalısınız. Bu yapılandırma, özellikle yoğun veritabanı veya ağ trafiği olan uygulamalarda performans darboğazlarını ortadan kaldırır.
Log4j ile Hata Ayıklama (Debugging) ve İzleme Senaryoları
Uygulamanızda beklenmedik bir hata oluştuğunda, sadece hata mesajı yeterli olmayabilir. Hatanın oluştuğu anki değişken değerlerini ve uygulama durumunu yakalamak için MDC (Mapped Diagnostic Context) yapısını kullanmalısınız. MDC, her iş parçacığı (thread) için özel bir bağlam oluşturur ve log satırlarına otomatik olarak eklenmesini sağlar.
Aşağıdaki örnekte, bir kullanıcı oturumuna özel ID bilgisini loglara nasıl ekleyeceğinizi görebilirsiniz:
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class OrderService {
private static final Logger logger = LogManager.getLogger(OrderService.class);
public void processOrder(String orderId) {
// MDC ile bağlamı ayarla
ThreadContext.put("orderId", orderId);
try {
logger.info("Sipariş işleme başladı.");
// İş mantığı buraya gelir
} finally {
// Bellek sızıntısını önlemek için temizle
ThreadContext.clearAll();
}
}
}
Bu yapı sayesinde, log dosyalarınızda %X{orderId} desenini kullanarak, binlerce satır arasından sadece belirli bir siparişe ait logları kolayca filtreleyebilirsiniz. Bu yöntem, özellikle mikro hizmet mimarilerinde hata izleme (tracing) süreçlerini büyük ölçüde kolaylaştırır.
Log Dosyalarını Arşivleme ve Temizleme Stratejileri
Log dosyalarınızın disk alanını tüketmesini engellemek için RollingFileAppender içerisinde DefaultRolloverStrategy kullanmak en iyi pratiktir. Aşağıdaki yapılandırma, log dosyalarınız 10MB boyutuna ulaştığında yeni bir dosya oluşturur ve en fazla 7 adet yedek dosya tutar:
Bu konfigürasyon ile .gz uzantısı kullanarak logların otomatik olarak sıkıştırılmasını sağlayabilir, böylece disk alanından ciddi oranda tasarruf edebilirsiniz.
Sonuç
Java ile Log4j kütüphanesi kullanarak uygulama kaydı oluşturmak, uygulamanızın kararlılığını artırmak ve sorunları hızlıca tespit etmek için atılacak en önemli adımdır. Bu rehberde, temel kurulumdan gelişmiş asenkron günlükleme yapılandırmalarına kadar profesyonel bir yaklaşımı inceledik. Bir sonraki adım olarak, günlüklerinizi merkezi bir sunucuda (ELK Stack gibi) toplamak için Log4j'nin ağ tabanlı appender'larını araştırmanızı öneririm.
Yasal Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri ve yapılandırmalar genel eğitim amaçlıdır. Uygulamanızın canlı ortamına geçmeden önce tüm güvenlik kontrollerini yapmalı ve verilerin gizliliği konusundaki yasal düzenlemelere (KVKK, GDPR vb.) uyduğunuzdan emin olmalısınız.


Yorumlar (0)
Yorum Yaz