web-gelistirme-sc.com

Hazırda Bekletme 4'teki günlüğü SLF4J kullanacak şekilde nasıl yapılandırabilirsiniz?

Hazırda Bekletme 3.x, günlük kaydı için slf4j kullanılır. Hazırda Bekletme 4.x, jboss-logging kullanır. Hibernate 4 ve SLF4J kullanan ve günlük kaydı için kullanılan bağımsız bir uygulama yazıyorum.

Hazırda Bekletme modunu SLF4J'ye giriş yapacak şekilde nasıl yapılandırabilirim?

Bu mümkün değilse, Hibernate'in günlüğünü nasıl yapılandırabilirim?

[Hazırda Bekletme 4.1 manuel bölüm günlüğüne kaydetme ...

Tamamen güncel değil. Hazırda Bekletme, 4.0'da başlayan JBoss Logging'i kullanır. Bu içeriği Geliştirici Kılavuzuna geçirdiğimizde belgelenecektir.

... SLF4J hakkında konuşmaya devam ediyor ve bu da işe yaramaz. Ne başlangıç ​​kılavuzu ne de geliştirici kılavuzu , günlüğe kaydetme hakkında hiç konuşmaz. Ne de migrasyon kılavuzu .

Jboss-logging'in kendisiyle ilgili dokümantasyon aradım, ancak hiçbirini bulamadım. GitHub sayfası sessiz ve JBoss'un topluluk projeleri sayfası jboss günlüğünü listelemiyor bile. Bu projenin bug tracker 'in dökümantasyonla ilgili herhangi bir sorunu olup olmadığını merak ettim, ama değil.

İyi haber şu ki, Hazırda Bekletme 4'ü JBoss AS7 gibi bir uygulama sunucusu içinde kullanırken, günlüğe kaydetme işleminin büyük ölçüde sizin için halledilmiş olması. Ama bağımsız bir uygulamada nasıl yapılandırabilirim?

106
Tom Anderson

https://github.com/jboss-logging/jboss-logging/blob/master/src/main/Java/org/jboss/logging/LoggerProviders.Java : 'a bakınız.

static final String LOGGING_PROVIDER_KEY = "org.jboss.logging.provider";

private static LoggerProvider findProvider() {
    // Since the impl classes refer to the back-end frameworks directly, if this classloader can't find the target
    // log classes, then it doesn't really matter if they're possibly available from the TCCL because we won't be
    // able to find it anyway
    final ClassLoader cl = LoggerProviders.class.getClassLoader();
    try {
        // Check the system property
        final String loggerProvider = AccessController.doPrivileged(new PrivilegedAction<String>() {
            public String run() {
                return System.getProperty(LOGGING_PROVIDER_KEY);
            }
        });
        if (loggerProvider != null) {
            if ("jboss".equalsIgnoreCase(loggerProvider)) {
                return tryJBossLogManager(cl);
            } else if ("jdk".equalsIgnoreCase(loggerProvider)) {
                return tryJDK();
            } else if ("log4j".equalsIgnoreCase(loggerProvider)) {
                return tryLog4j(cl);
            } else if ("slf4j".equalsIgnoreCase(loggerProvider)) {
                return trySlf4j();
            }
        }
    } catch (Throwable t) {
    }
    try {
        return tryJBossLogManager(cl);
    } catch (Throwable t) {
        // nope...
    }
    try {
        return tryLog4j(cl);
    } catch (Throwable t) {
        // nope...
    }
    try {
        // only use slf4j if Logback is in use
        Class.forName("ch.qos.logback.classic.Logger", false, cl);
        return trySlf4j();
    } catch (Throwable t) {
        // nope...
    }
    return tryJDK();
}

org.jboss.logging.provider için olası değerler: jboss, jdk, log4j, slf4j.

org.jboss.logging.provider değerini ayarlamazsanız jboss, ardından log4j, ardından slf4j (sadece logback kullanılırsa) ve jdk komutuna geri dönersiniz.

slf4j ile logback-classic kullanıyorum:

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.0.13</version>
        <scope>${logging.scope}</scope>
    </dependency>

ve hepsi iyi çalışıyor!

UPDATE Bazı kullanıcılar çok ana App.Java’da kullanır:

static { //runs when the main class is loaded.
    System.setProperty("org.jboss.logging.provider", "slf4j");
}

ancak konteyner bazlı çözümler için bu işe yaramadı.

UPDATE 2 Log4j'yi SLF4J ile jboss-logging için yönetdiklerini düşünenler tam olarak bu şekilde değil. jboss-logging, SLF4J olmadan doğrudan Log4j kullanır!

54
gavenkoa

SLF4J'nin arka uç olarak Logback olmadan JBoss Günlüğü ile çalışabilmesi için org.jboss.logging.provider=slf4j sistem özelliğinin kullanılması gerekir. log4j-over-slf4j taktikleri bu durumda çalışmıyor gibi görünmektedir, çünkü ne Logback ne de log4j aslında sınıf yolunda mevcut değilse, günlük JDK'ye geri döner.

Bu biraz sıkıntı verici ve işe otomatik algılama yapabilmek için sınıf yükleyicinin, JBoss Günlüğü'nün JDK günlüğüne düşmemesini önlemek için logback-classic'ten ch.qos.logback.classic.Logger veya log4j'den org.Apache.log4j.Hierarchy içerdiğini görüyorsunuz.

Büyü, org.jboss.logging.LoggerProviders adresinde yorumlanır.

GÜNCELLEME: Servis yükleyici desteği eklendi, böylece META-INF/services/org.jboss.logging.LoggerProvider (değer olarak org.jboss.logging.Slf4jLoggerProvider ile) bildirerek otomatik algılama ile ilgili sorunlardan kaçınmak mümkün olacak. Log4j2 desteği de var gibi görünüyor.

26
Tuomas Kiviaho

Leif'in Hipoport postasından ilham alan , bu şekilde Hazırda Bekletme 4'ü slf4j'ye geri "bükdüm": 

Maven kullandığınızı varsayalım.

  • org.slf4j:log4j-over-slf4j 'a bağımlılık olarak pom.xml ekleyin
  • mvn dependency:tree komutunu kullanarak, slf4j:slf4j üzerinde depende kullandığınız nesnelerin hiçi 'nin olmadığından emin olun (kesin olması için hiçbir eserde derleme kapsam bağımlılığı veya çalışma zamanıslf4j:slf4j 'e bağımlılık)

Arka plan: Hazırda Bekletme 4.x, artifact org.jboss.logging:jboss-logging öğesine bağımlı. Geçişli olarak, bu yapay nesnenin, artifact slf4j:slf4j'ya verilmiştir kapsam bağımlılığı vardır. 

Şimdi org.slf4j:log4j-over-slf4j eserini eklediğimiz için, org.slf4j:log4j-over-slf4j, slf4j:slf4j eserini taklit eder. Bu nedenle, JBoss Logging loglarının kaydettiği her şey şimdi slf4j'den geçecektir. 

Diyelim ki Logback, logging backend'iniz olarak kullanılıyor. İşte bir örnek pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    ....
    <properties>
        ....
        <slf4j-api-version>1.7.2</slf4j-api-version>
        <log4j-over-slf4j-version>1.7.2</log4j-over-slf4j-version>
        <jcl-over-slf4j-version>1.7.2</jcl-over-slf4j-version> <!-- no problem to have yet another slf4j bridge -->
        <logback-core-version>1.0.7</logback-core-version>
        <logback-classic-version>1.0.7</logback-classic-version>
        <hibernate-entitymanager-version>4.1.7.Final</hibernate-entitymanager-version> <!-- our logging problem child -->
    </properties>

    <dependencies>
            <!-- begin: logging-related artifacts .... -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>${slf4j-api-version}</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>jcl-over-slf4j</artifactId>
                <version>${jcl-over-slf4j-version}</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>log4j-over-slf4j</artifactId>
                <version>${log4j-over-slf4j-version}</version>
            </dependency>   
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>${logback-core-version}</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>${logback-classic-version}</version>
            </dependency>
            <!-- end: logging-related artifacts .... -->

            <!-- begin: some artifact with direct dependency on log4j:log4j ....  -->
            <dependency>
            <groupId>org.foo</groupId>
                <artifactId>some-artifact-with-compile-or-runtime-scope-dependency-on-log4j:log4j</artifactId>
                <version>${bla}</version>
                <exclusions>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>   
            </dependency>
            <!-- begin: some artifact with direct dependency on log4j:log4j ....  -->

            <!-- begin: a hibernate 4.x problem child........... -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>${hibernate-entitymanager-version}</version>
            </dependencies>
            <!-- end: a hibernate 4.x problem child........... -->
    ....
</project>

Sınıf yolunuzda, logback.xml'da bulunan gibi bir src/main/Java'ye sahip olun:

<!-- begin: logback.xml -->
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender> 

<logger name="org.hibernate" level="debug"/>

<root level="info">
    <appender-ref ref="console"/>
</root>

</configuration>
<!-- end: logback.xml -->

Bazı bileşenler, JTM açılış zamanında logback.xml'ye erişmek, örneğin Jetty Maven Eklentisi gibi uygun bir giriş yapmak isteyebilir. Bu durumda, emrinize bir Java sistemi logback.configurationFile=./path/to/logback.xml ekleyin (örneğin, mvn -Dlogback.configurationFile=./target/classes/logback.xml jetty:run). 

Hala "raw" konsol stdout Hazırda Bekletme çıktısını (Hibernate: select ... gibi) alıyorsanız, Yığın Taşması sorusu " Hazırda bekletme günlüğünü kapat " konsolu olabilir.

12
Abdull

Öncelikle, SLF4J'nin bir günlük kütüphanesi olmadığının farkındasınız, bu bir günlük sargısıdır. Hiçbir şey kaydetmiyor, sadece "arka uçlara" delege ediyor. 

Jboss-logging'i "yapılandırmak" için, sınıf yolunuzda (jboss-logging ile birlikte) kullanmak istediğiniz herhangi bir log çerçevesini ekleyin ve jboss-logging kalanını anlamaya çalışın.

JBoss Logging config için hazırda bekletme odaklı bir kılavuz hazırladım: http://docs.jboss.org/hibernate/orm/4.3/topical/html/logging/Logging.html

8
Steve Ebersole

Hibernate Core 4.1.7.Final ve Spring 3.1.2.RELEASE'i bağımsız bir uygulamada kullanıyorum. Bağımlılıklarıma Log4j 1.2.17'yi ekledim ve görünüşe göre, JBoss Logging mümkünse doğrudan log4j'e kaydediyor ve Spring Commons Logging'i kullanıyor, cadı mümkünse Log4j'yi kullanıyor, tüm Logging Log4J üzerinden yapılandırılabilir.

İşte benim ilgili bağımlılık listem:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.1.7.Final</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>3.1.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>3.1.2.RELEASE</version>
</dependency>
3
Stefan Scheidt

Hazırda Bekleme 4.3'ün bazı belgeleri nasıl org.jboss.logging kontrol edeceği hakkında:

  • Bir günlük sağlayıcısı için sınıf yolunu arar. Log4j'yi aradıktan sonra slf4j'yi arar. Bu nedenle, teoride, sınıf yolunuzun (WAR) log4j içermediğinden ve slf4j API'sini içerdiğinden emin olmak ve bir arka uç çalışması gerekir.

  • Son çare olarak, org.jboss.logging.provider system özelliğini slf4j olarak ayarlayabilirsiniz.


Dokümantasyondaki iddialara rağmen, org.jboss.logging log4j kullanmamaya rağmen log4j'nin kullanılmamasına ve SLF4J'nin mevcut olmasına rağmen Tomcat log dosyamda (/var/log/Tomcat/catalina.out) şu mesajla sonuçlanmasına neden oldu:

 log4j:WARN No appenders could be found for logger (org.jboss.logging).
 log4j:WARN Please initialize the log4j system properly.
 log4j:WARN See http://logging.Apache.org/log4j/1.2/faq.html#noconfig for more info.

Cevap önerisini dasAnderl ausMinga ile takip etmek zorunda kaldım ve log4j-over-slf4j köprüsünü dahil ettim.

3
Raedwald

bu yüzden, projemde çalışmaya başladım. kış uykusu 4, slf4j, logback. projem çok zor ama maven için de aynı olmalı.

Temelde Abdull haklı. Doğru olmadığı yerde, slf4j'yi bağımlılıklardan çıkarmak zorunda OLMAYINIZ.

  1. kapsamı derlemek için ekleyin:

    org.slf4j: slf4j-api

    org.slf4j: log4j-over-slf4j

    Örneğin. logback için (ch.qos.logback: logback-classic, ch.qos.logback: logback-core: 1.0.12)

  2. log4j lib'lerini bağımlılıklardan tamamen dışla

sonuç: Hazırda bekletme modülleri slf4j üzerinden logback'e geri dönüş . Tabii ki logback'ten farklı bir log uygulaması kullanabilmelisiniz.

log4j bulunmadığından emin olmak için, sınıf dosyalarındaki lib'lerinizi veya savaş dosyaları için web-inf/lib'ini kontrol edin.

elbette kaydedicileri logback.xml; :

<logger name="org.hibernate.SQL" level="TRACE"/>

2

Maven kullanıyorum ve şu bağımlılığı ekledim:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.6</version>
</dependency>

Sonra log4j.properties içinde bir /src/main/resources dosyası oluşturdum:

# direct log messages to stdout
log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
# set log levels
log4j.rootLogger=warn

Bu .jar'nizin kök dizinine koyacaktır. Bir cazibe gibi çalışır ...

2

Hazırda bekletme 4 günlük kaydını weblogic 12c ve log4j ile çalışırken bir sorun yaşadım. Çözüm, weblogic-application.xml'nize aşağıdakileri koymaktır:

<prefer-application-packages>
    <package-name>org.Apache.log4j.*</package-name>
    <package-name>org.jboss.logging.*</package-name>
</prefer-application-packages>
1
gozer

Karşılaştığım sorunla yüzleşebilecek herhangi birine. Burada açıklanan diğer tüm çözümleri denediyseniz ve hala slf4j'inizle çalışan hazırda beklemede olan günlük kaydını görmüyorsanız, bunun nedeni, klasör kitaplıklarında jboss-logging.jar olan bir kap kullandığınız olabilir. Bu, etkilemek için herhangi bir konfigürasyon bile ayarlayabilmeniz için önceden yüklenmiş olduğu anlamına gelir. .. weblogic'te bu problemi önlemek için, kulaktan/META-INF'den weblogic-application.xml dosyasında, uygulama. diğer sunucu kapları için benzer bir mekanizma olması gerekir .. __ Benim durumumda eklemek zorunda kaldım:

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-application xmlns:wls="http://xmlns.Oracle.com/weblogic/weblogic-application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/javaee_5.xsd http://xmlns.Oracle.com/weblogic/weblogic-application http://xmlns.Oracle.com/weblogic/weblogic-application/1.5/weblogic-application.xsd">
   <wls:prefer-application-packages>    
       <!-- logging -->
       <wls:package-name>org.slf4j.*</wls:package-name>
       <wls:package-name>org.jboss.logging.*</wls:package-name>             
   </wls:prefer-application-packages>
   <wls:prefer-application-resources>
        <wls:resource-name>org/slf4j/impl/StaticLoggerBinder.class</wls:resource-name>
    </wls:prefer-application-resources>     
</wls:weblogic-application>
0
Massimo