Log4j2 ile slf4j kullanmaya değer mi


114

Log4j2 ile slf4j kullanıp kullanmayacağıma karar veremiyorum. Çevrimiçi gönderilere göre, herhangi bir performansa sahip olacak gibi görünmüyor, ancak gerçekten gerekli mi.

Ayrıca bu noktalar log4j2'nin lehine hüküm sürer:

  • SLF4J, uygulamanızı Dizeleri günlüğe kaydetmeye zorlar. Log4j 2 API, metni günlüğe kaydetmek istiyorsanız herhangi bir CharSequence günlüğünü kaydetmeyi destekler, ancak herhangi bir Nesneyi olduğu gibi günlüğe kaydetmeyi de destekler.
  • Log4j 2 API, Mesaj nesneleri, Java 8 lambda ifadeleri ve gereksiz günlük kaydı için destek sunar (vararg dizileri oluşturmayı önler ve CharSequence nesnelerini günlüğe kaydederken Dizeler oluşturmayı önler).

2
Olabilir. Uygulama sunucum, slf4jlogback (veya log4jv1) içeriyorsa ? Daha sonra uygulamanızı kullanmak için üçüncü bir kaydedici yüklemeye zorlanmalı mıyım? Ya da belki kurumsal güvenlik sadece java.util.loggingüretimde kullanabileceğinize karar veriyor , o zaman ne olacak?
Elliott Frisch

Yazı için teşekkürler. Ancak, herkes log4j org kullanıyorsa, yukarıdaki argüman geçerli olmayacaktır.
Andy897

4
SLF4J kullanımı, şirket politikası değişirse, örneğin şirketiniz satın alındığında ve yeni politikalar size zorlandığında, uygulamanın değiştirilmesinin çok kolay olduğu anlamına gelir. SLF4J'yi şimdi kullanmak, kodu yazarken, doğrudan Log4j kullanmaktan daha fazla zaman almayacaktır. Doğrudan Log4j çağrılarını daha sonra değiştirmek çok zaman alacaktır. SLF4J, gelecek için ücretsiz bir yatırım / sigortadır. Bu Log4j 2 API özelliklerinden daha mı önemli? Buna yalnızca siz (veya şirket politikası) karar verebilirsiniz.
Andreas

İsterseniz log4j2 ile slf4j kullanmanın bir yolu var mı? Bu sayfa log4j ile kullanımı gösterir - kullanım ömrü sona ermiş olan sürüm 1.2), ancak log4j2 seçeneği yoktur. Bir yolu varsa, neden slf4j bundan bahsetmiyor?
J Woodchuck

Yanıtlar:


162

Devam edin: slf4j yerine log4j2 API'sini programlayın

Güvenlidir: Log4j2 API, slf4j ile tamamen aynı garantileri ve daha fazlasını sunar.

Artık Log4j2'nin kendisi bir API ve bir uygulama modülüne ayrıldığından, SLF4J kullanımında artık herhangi bir değer yoktur.

Evet, seçeneklerinizi açık tutmak iyi bir mühendislik uygulamasıdır. Daha sonra başka bir günlük uygulamasına geçmek isteyebilirsiniz.

Yaklaşık son 10 yıldır, uygulamanızda böyle bir esneklik oluşturmak, SLF4J gibi bir sarmalayıcı API kullanmak anlamına geliyordu. Ancak bu esneklik ücretsiz olarak gelmiyor: Bu yaklaşımın dezavantajı, uygulamanızın temeldeki günlük kitaplığının daha zengin özellik kümesini kullanamamasıdır.

Log4j2, uygulamanızın en düşük ortak payda ile sınırlı olmasını gerektirmeyen bir çözüm sunar.

Çıkış vanası: log4j-slf4j

Log4j2 bir log4j-to-slf4jköprü modülü içerir . Log4j2 API'sine göre kodlanan herhangi bir uygulama, herhangi bir zamanda destek uygulamasını herhangi bir slf4j uyumlu uygulamaya geçirmeyi seçebilir.

Log4j-to-slf4j

Soruda belirtildiği gibi, Log4j2 API'sini kullanmak doğrudan daha fazla işlevsellik sunar ve slf4j gibi bir sarmalayıcı API kullanmaya kıyasla bazı işlevsel olmayan avantajlara sahiptir:

  • Mesaj API
  • Tembel günlük kaydı için Lambdas
  • Sadece Dizeler yerine herhangi bir Nesneyi Günlüğe Kaydet
  • Çöpsüz: Mümkünse değişkenler oluşturmaktan veya Dizeler oluşturmaktan kaçının
  • CloseableThreadContext, işiniz bittiğinde öğeleri MDC'den otomatik olarak kaldırır

(Daha fazla ayrıntı için SLF4J'de bulunmayan 10 Log4j2 API özelliklerine bakın.)

Uygulamalar, Log4j2 API'sinin bu zengin özelliklerini, yerel Log4j2 çekirdek uygulamasına kilitlenmeden güvenle kullanabilir.

SLF4J hala sizin emniyet valfinizdir, sadece uygulamanızın artık SLF4J API'ye karşı kodlama yapması gerektiği anlamına gelmez.


Açıklama: Log4j2'ye katkıda bulunuyorum.


Güncelleme: Log4j2 API'ye programlamanın bir şekilde "bir cephe için cephe" getirdiği konusunda bazı karışıklıklar var gibi görünüyor. Log4j2 API ve SLF4J arasında bu açıdan bir fark yoktur.

Her iki API, yerel bir uygulama kullanırken 2 bağımlılık ve yerel olmayan bir uygulama için 4 bağımlılık gerektirir. SLF4J ve Log4j2 API bu açıdan aynıdır. Örneğin:

Gerekli bağımlılıklar SLF4J ve Log4j 2 API için benzerdir


7
Anlıyorum. Sorumu yeniden ifade etmeme izin verin. Log4j2 dışında herhangi bir bağımsız log4j2 API uygulaması var mı?
Ceki

5
Log4j2 API ve impl edilir değil "sıkı bağlı". Tüm bu SLF4J uygulamalarının tümü mevcuttur: Log4j2 API'ye göre kodlanmış bir uygulama, log4j-to-slf4jbunun yerine bağımlılığı log4j-coreseçebilir ve bahsettiğiniz bu SLF4J uygulamalarından herhangi birini seçebilir. Log4j2 API'sinin yerel uygulamalarının sayısı ilgisizdir.
Remko Popma

19
Sorun şu ki, kendi kendilerinin slf4j kullandığı kitaplıklara bağımlılıklarınız oluyor, bu yüzden buna bağlı kalmak daha kolay.
Davio

18
bu yüzden, bir uygulama için bir arayüz için bir arayüz kullanmalı mıyım? Evet, hayır, teşekkürler ... Slf4j, log4j'yi, loglama için iyi bir uygulama arabirimi sağlayarak yumruk attı ... log4j2, slf4j api'yi uygulamalı - eksik bir özellik varsa, slf4j yeniyi almazsa, geri katkıda bulun. özelliği, sonra MAYBE log4j2 api arayüzleri için bir durum var ....
RockMeetHardplace

4
@RemkoPopma - hala log4j arayüzünü kullanmamayı savunuyorsunuz. Evet, anladım - log4j2 arayüzünü zincirleyebilirim -> slf4j arayüzü -> uygulama ne olursa olsun, ancak soyutlamayı soyutlamamayı tercih ederim - teşekkürler ama hayır teşekkürler.
RockMeetHardplace
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.