2010-01-14 21 views
47

Log4j'nin class loading issues (diğerleri arasında) olduğu görülüyor ve bana öyle geliyor ki, bu eğilim log4j'den slf4j'ye doğru hareket etmektir. (Hazırda bekletme ikincisini lehine kullanarak durdu)Log4j, Slf4j'nin lehine terk edilmiş mi?

  1. Doğru mu?
  2. Log4j'deki slf4j'nin çözdüğü ana sorunlar nelerdir?
  3. Son söz slf4j mi, yoksa daha iyi bir "sonraki sonraki log4j" endüstri standardı var mı?

Güncelleme:

  • Yani delfuego bu answer kabul edebilir, beni karıştırır/o nesne ?:

Sen büyük bir sorun sendeledi görünmektedir log4j (ve Apache Commons Günlüğü kitaplığı), ile bir gülünçvar, 'u keşfederek ve etkileyerek kullanıldıklarında doğru sınıf yükleyicileriyle etkileşime girer. Burada, örnekleriyle birlikte çok yoğun bir açıklaması vardır; ev içi mesajı, 'un için ana sürüş kuvvetlerinden birinin SLF4J'nin yeni oturum açma çerçevesi SLF4J'nin olduğunu, bu sorunları tamamen ortadan kaldırmasıdır. Siz sizin yerinize takmak isteyebilir ve hayatınızın daha kolay yapılıp yapılmadığını görmek isteyebilirsiniz. log4j tarafından

+4

http://articles.qos.ch/classloader.html adresinden başvurulan makale, log4j ile ilgili sınıf sorunları değil, Jakarta Commons Logging (başka bir günlüğe kaydetme cephesi) ile ilgilidir. SLF4J, bu sınıf yükleme sorunlarını ortadan kaldırmak için gerçek altta yatan kayıt sisteminin (muhtemelen log4j dahil) kodunun yerini aldığı ve paketlediği şeydir. –

+0

Mümkün yinelenen [Yeni projeler log4j yerine logback kullanmalı mıyım?] (Http://stackoverflow.com/questions/178836/should-new-projects-use-logback-instead-of-log4j) – ripper234

cevap

46

Slf4j gerçekten sadece bir günlük cephesidir. Ancak, Log4j'nin aynı yazarlardan Logback tarafından başarılı olması amaçlanmıştır.

Güncelleme:

if (logger.isDebugEnabled()) { 
    logger.debug("Message: " + bigObject + ", " + anotherBigObject); 
} 

: Eğer SLF4J başka yararı hakkında bilmek isterseniz, bu (çirkin) yapıları gereksiz yere çağrılmış toString() önlemek için artık gerekli değildir aşağıdakilerin olması var Bunun yerine parametreli mesajların yararlanabilirler: Ayrıca bakınız

logger.debug("Message: {}, {}", bigObject, anotherBigObject); 

What is the fastest way of (not) logging?

+0

+1: Sadece birkaç gün önce çok benzer bir soruydu ve arka planda slf4j kullanan Logback'i kullanmaya başladım. – lostiniceland

+0

?! varargs, işlevlerin yürütülmesini durdurmaz ... değil mi? –

+4

Hayır, ancak bir nesneyi dizeye eklediğinizde gerçekleşen toString uygulamasının yürütülmesini durdurur. Günlüğe kaydetme işleminin asıl meselesi, günlük işlevine yapılan çağrı değil, kaydedilen dizinin yapılışıdır! –

6

slf4j page bakıldığında bunun gibi görünmüyor log4j yerini alacak - bu aynı temel günlüğü çerçevesini kullanmasına izin sadece ediyorum Tüm uygulamanız için (örn. log4j), kütüphanelerin otomatik olarak bağlanmasına izin verir.

Log4j'den Apache Commons Logging yerine daha çok benziyor.

3

SLF4J, bence, kullandığınız köprüler aracılığıyla kullandığınız tüm kitaplıkların günlüğünü birleştirebileceğiniz büyük avantaj. Diğer kayıt çerçevelerinin hiçbiri buna izin vermez. Bu, projelerin SLF4J'ye sorunsuz bir şekilde taşınmasına ve bağımlılıkların oluşturduğu günlük çerçevesi seçimini göz ardı etmesine izin verir.

+1

slf4j bir günlüğü değil çerçeve. Birkaç loglama çerçevesinden birinin cephesi. –

18

Slf4J, Log4j için bir alternatif değildir, bunun yerine günlük kaydı için bir Cephe sağlar, böylece kendi günlük çerçevenizi takabilirsiniz. Temelde kütüphaneler için yararlıdır. slf4j.org gelen :

Java veya (SLF4J) için basit Günlüğü Cephe, örneğin, basit bir cephe veya çeşitli günlük çerçeveleri için soyutlama olarak görev yapar java.util.logging, log4j ve logback, son kullanıcısına, dağıtım zamanında istenilen günlük çerçevesini takmaya izin verir.

Soruna cevap olarak: SLF4J şimdi çerçeveler tarafından kabul ediliyor, ama projelerinizde, sen Log4J (veya başka) kullanmaya devam edebilir

+0

Yani bu cevap kafa karıştırıcı: http: // stackoverflow.com/sorular/1974705/log4j-ve-iplik-bağlama classloader/1974775 # o slfJ sonuçta Log4j yarattığı sorunları çözer ima 1974775 ... bu olabilir onun Cephe özelliği yanında, aynı zamanda iyi bir Bağımsız sahip olduğunu yerel günlük uygulaması log4j'den daha mı iyi? – ruchirhhi

+1

SLF4J, bunun altında gerçek bir günlük uygulaması gerektirir. Bu hala Log4j olabilir veya SLF4J arayüzlerini yerel olarak uygulayan Logback'i kullanabilirsiniz (SLF4J ve Logback aynı kişi tarafından yazılmıştır). – SteveD

+0

Bu sadece bir cephe. Bununla birlikte, SLF4J'nin birinci sınıf uygulaması olarak tasarlanan Logback adında yeni bir uygulama var. SLF4J, Log4J ve Logback'in Log4J'yi durmuş olarak görmesini sağlayan aynı kişi tarafından yaratıldığına dikkat etmek gerekir. StackOverflow üzerinde bir hesabı vardır (kullanıcı adı Ceki'dir) ve bunu çoğu Log4J/SLF4J iş parçacığında yeniden gönderme eğilimindedir. SLF4J arasında – GaryF

7

İlk: önemli bir nokta: SLF4J önyüzü günlüğü olduğu Ana loggin sistemlerinin çoğunun altında kullanılabilecek API (API): örneğin log4j veya java.util.logging. Yani sfl4j'yi commons-logging ile karşılaştırmak daha iyidir. Log4j eyaletinde Hakkında

, Fark etmemiştim

Bir şey log4j gelişme esasen ölü olmasıdır The state of java logging (bir yıl önce) alıntıların. Şu anda 1.2 sürümünde ve 1.3 sürümü için planlar, gelişen log4j 2.0'ın lehine terk edildi. Ancak, 2.0'ın aktif geliştirmede olduğu görünmüyor. Log4j projesinin asıl kurucusu olan Ceki Gülcü’nin slf4j’ye geçtiğini belirtmek gerekir (aşağıya bakınız).

3

Slf4j gerçek bir kayıt cephesi değil. Slf4j, uygulayıcılarının birçok özelliğini desteklemez. Kısaca, aşağıda log4j örneklerinden bahsediyorum.

  • SLF4J bir kullanıcı seçilen yapılandırma dosyası belirtmek olamaz, ama güçleri kullanıcı pek çok Java kökleri birinde (varsayılan (log4j.properties veya log4j.xml) kullanmak için her Kavanoz bir kök artı JVM kök ve sınıfları veya bin sahiptir). İki JAR dosyası varsa, hangisinin güvenli bir şekilde kullanılacağını kontrol etmek zordur.
  • Slf4j, 'fatal' gibi tüm Log4j seviyelerini destekleyemez. Büyük kodu Log4j'den Slf4j'ye değiştirirken, büyük kod değiştirme çabası gereklidir (örn. Seviyelerini nasıl düzenleyeceğine karar vermek).
  • İki anahtar Jar dosyası (log4j-over-slf4j.jar veya slf4j-log4j12.jar) seçilmelidir. Sınıf yolu her ikisi de işe yaramazsa. Rastgele birini seçerseniz, beklenmedik özellikleri kaybedersiniz (örneğin, log4j-over-slf4j.jar aynı sınıflar için çoklu günlük dosyalarını desteklemez; örneğin, olay günlüğü için bir tane ve bir tanesi işlenmemiş veri günlüğü için).