Java'da Oturum Açma Neler Oluyor? [kapalı]


117

Neden biri diğeri yerine aşağıdaki paketlerden birini kullansın?

  • Java Günlüğü
  • Commons Günlüğü
  • log4J
  • sLF4J
  • Yeniden giriş yap

4
SLF4j'yi Commons Logging ile karşılaştıran stackoverflow.com/questions/873051'i isteyebilirsiniz .
James McMahon

24
Ceki neden 3 günlükleme çerçevesi yarattı !!! bu delilik ...
mP.

6
@mP. - log4j ilk oldu, sonra anlaşmazlık çıktı ve slf4j + logback yazıldı. slf4j, API'dir ve API'nin uygulanmasını geri alır. Her şeyden bağımsız olarak, slf4j son derece kullanışlıdır.
Thorbjørn Ravn Andersen

3
Ceki Gülcü'nün neden SLF4J + Logback'i oluşturduğuna dair ayrıntılar için aşağıdaki Devoxx konuşmasına bakın: parleys.com/#st=5&id=1701
bitek

Bundan çıkacak en iyi şey, günlük dünyasını birleştireceğini umduğumuz slf4j API'sidir. Geri dönüşün geliştiricilerle henüz kritik bir kitleye ulaşmadığını düşünüyorum.
Thorbjørn Ravn Andersen

Yanıtlar:


86

API görünümünün kronolojik sırasına göre (bildiğim kadarıyla):

  • Log4j çünkü çoğu kişi kullanıyor (benim deneyimime göre)
  • Commons Logging, çünkü açık kaynaklı projeler onu kullanır (böylece entegre çözümde kullanılan günlükleme çerçevesi ile entegre olabilirler); Özellikle bir API / Çerçeve / OSS iseniz ve Commons Logging kullanan diğer paketlere güveniyorsanız geçerlidir.
  • Commons Logging, çünkü belirli bir loglama çerçevesine "kilitlenmek" istemezsiniz (bunun yerine Commons Logging'in size verdiği şeyi kilitlersiniz) - Bu noktayı sebep olarak kullanmaya karar vermenin mantıklı olduğunu düşünmüyorum.
  • Fazladan bir kavanoz eklemek istemediğiniz için Java günlüğü.
  • SLF4j, Commons Logging'den daha yenidir ve parametreli günlük kaydı sağlar:

logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
    // Note that it's actually *more* efficient than this - see Huxi's comment below...
    logger.debug("The entry is " + entry + "."); 
}
  • Log4j'den daha yeni olduğu için Logback, SLF4j'yi doğrudan uyguladığından parametreli günlük kaydını destekler
  • SLF4j / Logback, çünkü log4j'yi yapan aynı kişi tarafından yazıldı, bu yüzden onu daha iyi hale getirdi ( Ken G'ye göre - teşekkürler. Daha önceki haber gönderilerine bakıldığında uygun görünüyor )
  • SLF4j çünkü aynı zamanda bir log4j bağdaştırıcısı yayınlarlar, böylece eski kodda log4j'yi "kapatmak" zorunda kalmazsınız - sadece log4j.properties'in SLF4j kullanmasını sağlayın ve yapılandırması

3
Söyleyebileceğim kadarıyla, ortak günlük kaydının arkasındaki fikir, kütüphanelerde kullanılması gerektiğidir. Bu şekilde, kütüphane her zaman barındırma uygulamasının kullandığı aynı günlüğe kaydetme çerçevesini (ortak günlük kaydı aracılığıyla) kullanabilir.
Joachim Sauer

Soru için Loki'ye çok teşekkürler. Artık log4j'yi varsayılan çerçevem ​​olarak kullanmayacağımı biliyorum. SLF4j FTW! Ayrıca Ken G'ye SLF4j'nin log4j ile aynı kişi tarafından yazıldığını belirttiği için teşekkürler
Stephen

3
Kod örneğinizdeki yorum% 100 doğru değil. Mesajın gerçek biçimlendirme olay gerçekten bir appender tarafından ele eğer sadece olur böylece Logback tarafından tembel yapılır ve appender biçimlendirilmiş mesaj gerektirir - örneğin durumunda ne olmaz bir SocketAppender olay kullanarak seri hale beri değişmemiş mesaj kalıbı + Dizeler olarak argümanlar. Sanırım bu sadece "etkili" yi nasıl tanımladığına bağlı. Kesinlikle aynı mesajı yayacaktır (en azından giriş ve nesne aynı ise;), bu yüzden lütfen benim nitelememi affedin.
Huxi

6
SLF4J aslında diğer günlükleme çerçevelerinin üstüne oturan bir API'dir. Commons Logging'in amacına benzer, ancak deneyimlerime göre daha sezgisel.
James McMahon

37

Java'da günlüğe kaydetmeyi kafa karıştırıcı, tutarsız, yetersiz belgelenmiş ve özellikle gelişigüzel buluyorum. Dahası, bu günlükleme çerçeveleri arasında büyük miktarda benzerlik vardır ve bu da çabanın tekrarlanmasına ve gerçekte hangi günlüğe kaydetme ortamında olduğunuza dair kafa karışıklığına neden olur. Özellikle, ciddi bir Java web uygulaması yığınında çalışıyorsanız, genellikle çoklutek seferde kayıt ortamları; (ör. hazırda bekletme, log4j ve tomcat java.util.logging kullanabilir). Apache commons, farklı günlükleme çerçevelerini köprülemek içindir, ancak gerçekten sadece daha fazla karmaşıklık ekler. Bunu önceden bilmiyorsanız, bu tamamen şaşırtıcıdır. Günlük mesajlarım neden konsola vb. Yazdırılmıyor? Ohh çünkü log4j'ye değil Tomcat günlüklerine bakıyorum. Yine bir başka karmaşıklık katmanı ekleyerek, uygulama sunucusu, belirli bir web uygulaması için yerel konfigürasyonları tanımayabilen global günlük kaydı konfigürasyonlarına sahip olabilir. Son olarak, tüm bu kayıt çerçeveleri ÇOK KOMPLİKASYONDUR. Java'da oturum açmak, benim gibi geliştiricilerin hayal kırıklığına uğramasına ve kafalarının karışmasına neden olan düzensiz bir karmaşa oldu.

Java'nın ilk sürümlerinde, bu senaryoya yol açan yerleşik bir günlük kaydı çerçevesi yoktu.


19
Bu bir cevap mı? Daha çok rant gibi görünüyor.
Michael Myers

15
Üzgünüm. Bu ise bir rant biraz. Ama aynı zamanda "Java'da Günlüğe Kaydetmede Neler Oluyor?" Sorusuna da ikna edici bir cevaptır. Kısaca cevap, derinden kırılmış olmasıdır.
Julien Chastang

1
Peki -1 oy değerinde değil; P Ama düşünülmesi gereken bir şey.
guyumu

21
Sun, Java 1.4'e java.util.logging'i eklediğinde sorunlar başladı. Bundan önce LOG4J iyi kurulmuş ve yaygın bir şekilde kullanılıyordu. Bundan sonra, hem LOG4J hem de java.util.logging'i desteklemek için sarmalayıcılara ihtiyaç vardı. Ayrıca jul, java. * Paketinde yer aldığından, bir JAR'ı değiştirerek değiştirilemez - bu, SLF4J'nin diğer çerçeveleri birbirine bağlamasıdır. Bu muhtemelen şimdiye kadarki en kötü Güneş fikriydi ... ve nihayetinde "iyi bir Java vatandaşının" temmuz kullanması gerektiği yanlış varsayımına yol açtı.
Huxi

4
@Huxi, Takvim API'sinin daha kötü olduğunu düşünüyorum. Sun'ı savunmak için bu onların kodu değildi, ama Taglient'ten geldi.
Thorbjørn Ravn Andersen

22

Daha önce bahsedilmeyen önemli bir nokta var:

SLF4J (ve günlük arka ucu olarak Logback ve LOG4J), Eşlenmiş Tanılama Bağlamı (MDC, bkz. Javadoc ve belgelere ) için desteğe sahiptir .

Bu esasen, günlük olayınıza ek bağlam bilgisi eklemek için kullanabileceğiniz bir iş parçacığı yerel Eşlemidir <Dize, Dize>. MDC'nin mevcut durumu her olaya eklenir.

İsteğin kullanıcı adı ve URL'si (bir web uygulaması olması durumunda) gibi şeyler eklerseniz, bu inanılmaz derecede yararlı olabilir. Bu, örneğin bir filtre kullanılarak otomatik olarak yapılabilir.


2
Teknik olarak, bu bir iş parçacığı yerel Haritası <Dize, Dize>.
pdxleif


4

Şirket projemizde LOG4j kullanıyoruz ve Stephen'ın örneğinde gösterdiği gibi kullanımı çok kolay. Ayrıca LOG4j için kendi desen sınıflarımızı yazdık, böylece kendi çıktı dosyası şemalarınızı oluşturabilirsiniz. Günlük dosyanızın nasıl görünmesi gerektiğini tarif edebilirsiniz. Orijinal log4j sınıflarını geliştirmek mümkündür.

Tüm LOG4j özelliklerini bir log4j.properties dosyasında değiştirebilirsiniz, böylece farklı projeler için farklı dosyalar kullanabilirsiniz.

Java günlüğü benim favorim değil, ancak bunun nedeni başlangıçta log4j kullanmam olabilir.


4

Commons Günlüğü bakış temeldeki günlüğü çerçevesinde üzerinde hiçbir kontrole sahip olduğunda, kütüphane koddan günlüğü: kendi varlığı için neden verir. Dış uygulamalara bağlanacak olan çeşitli Apache projeleri için çok önemlidir. Tam kontrole sahip olduğunuz dahili BT projeleri için belki o kadar önemli değil.

Bununla birlikte, tanıdığım diğer birçok geliştirici gibi Commons Logging'e yazıyorum. Bunun nedeni zihinsel yükünüzü en aza indirmektir: projeleri veya işleri değiştirebilir ve yeni bir çerçeve öğrenmeniz gerekmez (yeni işin / projenin aynı zamanda CL kullanması ve / veya onları buna geçmeye ikna etmeniz şartıyla).

Ayrıca, hangi çerçeveyi kullanırsanız kullanın kendi sarmalayıcılarınızı oluşturmanın bazı değerleri vardır. Açıklandığı gibi burada , ben (önemli) özel stringification sağlamak için bir LogWrapper nesnesini kullanın ve (daha az önemli) giriş tabloların görsel dağınıklığı azaltmak ister.


1
Ayrıca, tüm CL günlüklerini SLF4J üzerinden yönlendirmek için kullanılabilecek bir commons.logging => SLF4J köprüsü de vardır. SLF4J, commons.logging, LOG4J ve (biraz hantal, ancak mümkün olduğu kadar iyi) java.util.logging arasında köprü oluşturmayı destekler, böylece tüm günlükler, hangi SLF4J arka ucunda kullanılırsa kullanılsın sonuçlanacaktır. Bkz. Slf4j.org/legacy.html Logback , btw kullanırdım, ancak önyargılı olduğumu iddia edebilirsiniz.
Huxi

2

Genelde Log4J'yi varsayılan olarak kullanırdım.

Java 1.4'e bağımlı olsaydım Java Logging'i kullanırdım, ancak yine de Log4J'yi tercih ederim.

Halihazırda kullanmış bir şeyi geliştiriyor olsaydım, Commons Logging'i kullanırdım.


1.4'e bağımlılık sorun değil mi ?? 1.4 bile hizmet ömrünün sonuna geldi.
Tom Hawtin - tackline

2
@Tom O jdk1.4 demek + aptal olma.
mP.

Aslında son zamanlarda hala jdk 1.3 :-( altında çalışan bir sistemde bazı işler yaptım ve iki yıldan daha kısa bir süre önce bir jdk 1.2 sistemini sürdürüyordum . için, sadece yükseltmeleri yüklemeyi reddediyorlar.
Michael Rutherfurd

0

Günlük çerçevelerinden herhangi birine yazabilen ince bir ağaç kesme cephesi oluşturmanızı öneririm, bu noktada destek motoru seçimi hemen hemen tartışmalı bir noktaya dönüşür.


2
Ortak günlüğün yaptığı budur, öyleyse neden tekerleği yeniden icat edelim? Ayrıca, ortak kayıtların halihazırda yaptığı gibi, cephenizin halletmesi gereken bazı sorunlar vardır.
James AN Stauffer

+1 Ortak günlük kaydı argümanına karşı koymak için, Bazı kurumsal uygulamalar özel kaydedici kullanır. Altta yatan uygulamayı gizlemek her zaman iyi bir fikirdir. 'İnce' ambalaj, başka bir kavanozun paketlenmesi ihtiyacını ortadan kaldırır ve yeniden icat etmek kadar değildir.
questzen

1
Bu, kısa süre önce çerçevemizi Compact Framework'e (.Net içinde) taşıdığımızda beni kurtardı. Eğer nLog üzerinde bağımlılıkları kodlamış olsaydık, mahvolmuştuk. Bu yaklaşımı kullandığımız için, sıfır kaydediciye girip mutlu olmayı başardık. Birisi bana 0'a kadar oy ver lütfen :-)
tsimon

3
Bir tane zaten var - slf4j'ye bir göz atın. Çalışma zamanı sınıf yolunda kavanozları değiştirerek uygulama başlangıcında günlük çerçevelerini değiştirmenize olanak tanıyan, kabul edilen ince bir sarmalayıcıdır.
09'u

1
tıkanmanın hangi çerçeveyi kullanacağını keşfetmenin kendine özgü bir yolu vardır - bu hoş değildir ve oldukça kıvrımlıdır. Ceki kaç tane günlükleme çerçevesi oluşturdu? Kişi, kendi günlüğünüzle tıkanıyor olsa bile, her zaman bir ara yönlendirme seviyesi yerleştirmeye ve bir uygulamayı gizlemeye çalışmalıdır. Daha sonra, Travis'in bahsettiği gibi, perde arkasına istediğiniz her şeyi ekleyebilirsiniz.
mP.
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.