Java.util.logging log4j'ye nasıl gönderilir?


84

Tüm günlük kaydını log4j'ye karşı yapan mevcut bir uygulamam var. Ya log4j kullanan ya da ortamımızdaki kapaklar altında log4j kullanan Commons Logging'e karşı oturum açan bir dizi başka kitaplık kullanıyoruz. Bağımlılıklarımızdan biri slf4j'ye karşı günlük bile tutuyor, bu da sonunda log4j'yi delege ettiği için iyi çalışıyor.

Şimdi, bazı önbelleğe alma ihtiyaçları için bu uygulamaya ehcache eklemek istiyorum. Ehcache'nin önceki sürümleri, bu senaryoda mükemmel bir şekilde çalışacak olan ortak günlüğe kaydetmeyi kullanıyordu, ancak 1.6-beta1 sürümünden itibaren , ortak günlük tutmaya olan bağımlılığı kaldırıp yerine java.util.logging ile değiştirdiler.

Java.util.logging ile kullanılabilen yerleşik JDK günlüğü hakkında gerçekten bilgi sahibi olmamak, JUL'a gönderilen günlük mesajlarının log4j'ye karşı günlüğe kaydedilmesini sağlamanın kolay bir yolu var mı, böylece mevcut yapılandırmamı kullanabilir ve her türlü günlük kaydı için ayarları yapabilirim ehcache'den?

JUL için javadocs'a baktığımda, hangi LogManageruygulamanın kullanıldığını değiştirmek için bir grup ortam değişkeni ayarlayabilirim ve belki de bunu LoggerJUL Loggersınıfındaki log4j'leri sarmak için kullanabilirim . Bu doğru yaklaşım mı?

Bir kütüphanenin yerleşik JDK günlük kaydını kullanması, dünyanın geri kalanı (çoğu) bunun yerine 3. taraf kitaplıkları kullandığında böyle bir baş ağrısına neden olacağı biraz ironik.

Yanıtlar:


37

Başarıyla kullandığım bir yaklaşım, slf4j'yi birincil günlük API'm olarak kullanmaktır . Daha sonra log4j'ye slf4j bağlarım var. Diğer çerçeveleri (JUL gibi) kullanan üçüncü taraf bağımlılıkları slf4j'ye köprülenebilir .


2
İyi bağlantı, ama sanırım # jul-to-slf4j
araqnid

Kulağa iyi bir yaklaşım gibi geliyor, ancak onu çalıştıracak gibi görünmüyorum :(
matt b

2
Ayrıca, ehcache kadar popüler bir kütüphanenin java.util.logging gibi bir şeye geçiş yapacağına inanamıyorum - çok kafalı görünüyor
matt b

1
@matt b, JUL, Java çalışma zamanında her zaman mevcuttur, bu nedenle en az harici bağımlılıkları gerektirir. Bununla birlikte, benim gözümde bu kodun kullanımları konusunda deneyimli olmayan insanlar tarafından yazılmış gerçek bir kod örneğidir. Konfigürasyon sistemi oldukça elverişsizdir.
Thorbjørn Ravn Andersen

1
Sahip olduğunuz sorun, SLF4J'yi JUL ile birleştirirseniz, günlük kaydı performansının korkunç olmasıdır. Özellikle oluşturduğunuz her günlük satırı, hangi günlükçü bağlamının kullanılacağını belirlemek için atılan bir istisnayla sonuçlanır. Bu, çok fazla ek yük yaratır ve süreçleri yavaşlatır
Egwor

19

Biz kullanmak SLF4J mevcut proje üzerinde ve bizim için çok iyi çalışıyor. SLF4J, Log4J'nin yaratıcısı Ceki Gülcü tarafından yazılmıştır ve gerçekten harika bir iş çıkarmıştır. Kodumuzda SLF4J günlük API'larını doğrudan kullanıyoruz ve SLF4J'yi Jakarta Commons Logging (JCL), java.util.logging (JUL) ve Log4J API'lerinden gelen çağrıların tümü SLF4J API'lerine köprülenecek şekilde yapılandırıyoruz. Bunu yapmamız gerekiyor çünkü sizin gibi farklı günlük API'leri seçen üçüncü taraf (açık kaynak) kitaplıkları kullanıyoruz.

SLF4J'nin altında, onu belirli bir kaydedici uygulaması kullanacak şekilde yapılandırırsınız. Dahili veya "basit" bir kaydedici ile birlikte gelir ve bunu Log4J, JUL veya Logback ile geçersiz kılabilirsiniz . Yapılandırma, basitçe sınıf yolunuzdaki farklı jar dosyalarına bırakılarak yapılır.

Başlangıçta, yine Ceki Gülcü tarafından yazılan Logback uygulamasını kullandık. Bu çok güçlüdür. Ancak daha sonra uygulamamızı, günlük görüntüleyicisinin JUL biçimli mesajlar beklediği Glassfish Java EE uygulama sunucusuna dağıtmaya karar verdik. Bu yüzden bugün Logback'den JUL'a geçtim ve sadece birkaç dakika içinde iki Logback kavanozunu JUL uygulamasına bağlayan bir SLF4J kavanozu ile değiştirdim.

@Overthink gibi, kurulumunuzda SLF4J kullanmanızı yürekten tavsiye ederim.


8
Ceki'nin bir günlükleme çerçevesini / fascade'ini kaç kez yeniden keşfetmesi gerekiyor?
mP.

@mP: Günlük kaydı göz alıcı olmayabilir, ancak büyük ölçekli ticari sınıf yazılımlar için çok önemli bir ihtiyaç. Ve SLF4J, farklı günlükleme çerçevelerini kullanan (Sun'ın Log4J'yi benimsemek yerine java.utils.logging'i geliştirmeyi seçmesiyle daha acil hale gelen) kod entegre etme sorununu çözüyor.
Jim Ferrans

3
@mP, slf4j gerekliydi çünkü Sun'ın JUL ile yaptığı kötü iş. Logback, yeni bir proje değil, log4j çatalı.
Thorbjørn Ravn Andersen

3
Gerektiğini fark ettim, başka hiçbir şey olmasa bile, bu Apache değil ve aslında belgelendi.
Spencer Kormos

13

JUL ile log4j arasında köprü kurmak için SLF4J'den daha basit bir alternatif vardır, bkz. Http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html

Sadece jul-log4j-köprüsünü sınıf yoluna koymanız ve bir sistem özelliği eklemeniz gerekir:

-Djava.util.logging.manager=org.apache.logging.julbridge.JULBridgeLogManager

jul-log4j-bridge, Maven Central'da değil ve bu depodan getirilebilir:

<repository>
  <id>psmith</id>
  <url>http://people.apache.org/~psmith/logging.apache.org/repo</url>
  <releases>
    <enabled>false</enabled>
  </releases>
</repository>

ve sonra şununla kullanılır:

<dependency>
  <groupId>org.apache.logging</groupId>
  <artifactId>apache-jul-log4j-bridge</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>log4j</groupId>
      <artifactId>apache-log4j-component</artifactId>
    </exclusion>
  </exclusions>
</dependency>

Aşağıdaki adımlarla kaynaklardan yeniden oluşturmak da mümkündür:

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. pom.xml dosyasını düzenleyin, log4j: log4j: 1.2.15 üzerindeki bağımlılığı log4j ile değiştirin: apache-log4j-extras: 1.2.17 ve apache-log4j-bileşenine olan bağımlılığı kaldırın
  3. mvn paketi

4
Bence daha basit çünkü kodunuzu değiştirmeden yapılabilir, sadece bir sistem özelliği eklemeniz gerekir. SLF4J henüz benzer bir mekanizma önermiyor, ya kodu ya da logging.propertiesdosyayı değiştirirsiniz.
Emmanuel Bourg

1
Bu maalesef log4j2'de mevcut değil :(
BeepDog

JulLog4jBridge.assimilate();o_0
Bastian Voigt

2
UYARI! jul-log4j-bridgehiç yayınlanmamış apache-log4j-companionspaketi kullanır (terk edilmişlerden bir arka plan log4j 1.3). Onu inşa etmekte zorlanacaksınız. Doğal olarak, köprünün kendisi de yayın öncesi terk edilmiştir.
ivan_pozdeev

@ivan_pozdeev İyi nokta, teşekkürler. Bunu inşa etmek için talimatlar ekledim.
Emmanuel Bourg

9

EKİM 2014

Log4j'nin 2.1 sürümü olduğundan, tam olarak buna izin veren log4j-jul bileşeni vardır. Yine de, log4j 1 kullanıyorsanız, bu yaklaşımı kullanmak için log4j2'ye yükseltmeniz mümkün olmalıdır.

JDK Günlük Bağdaştırıcısı

Sınıf LogManager

Log4j 1.x'ten log4j 2'ye geçiş


2
Şu andan itibaren (2018 ortası) kabul edilen cevap bu olmalıdır
rmuller

Gelecekteki okuyucular için: Bunun işe yaradığını onaylıyorum. Yani, temel olarak (1) bunu pom mvnrepository.com/artifact/org.apache.logging.log4j/log4j-jul'unuza ekleyin ve (2) sistem özelliğini ilk bağlantıya ekleyin (örneğin, JVM parametrelerinde -Djava ekleyin. util.logging.manager = org.apache.logging.log4j.jul.LogManager)
Hossam El-Deen

3

Slf4j sitesinin java.util.logging olaylarını slf4j (ve dolayısıyla log4j) aracılığıyla geçirmek için bir köprüsü olduğuna inanıyorum.

Evet, SLF4J indirmesi jul-to-slf4j içeriyor ve bence tam da bunu yapıyor. Kayıtları SLF4J'ye iletmek için bir JUL işleyicisi içerir.


2

@Yishai - Wiki'me bağlantıyı gönderdiğiniz için teşekkürler. Oradaki örnek JUL'u Log4J'ye yönlendiriyor ve ben onu birkaç yıldır bir üretim sisteminde çalıştırıyorum. JBoss 5.x zaten JUL'u Log4J'ye yönlendiriyor, bu yüzden yükseltme yaptığımızda onu çıkardım. Şu anda birkaç şeyde kullandığım SLF4J'ye yönlendiren yeni bir tane var. Bir şansım olduğunda bunu göndereceğim.

Ancak, SLF4J'de zaten var:

http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j


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.