2012-05-14 14 views
12

Próbuję skonfigurować sl4j/logback pod Weblogic12. wdrożyć plik EAR, który posiada plik wojny, która ma WEB-INF \ Classes \ logback.xml
Oto config: sl4j/logback pod weblogic

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

<root level="debug"> 
    <appender-ref ref="STDOUT" /> 
</root> 

</configuration> 

Mój kod do logowania:

private static final Logger logger = LoggerFactory.getLogger(FrontEndServlet.class); 
//...... 
logger.info("info test"); 
logger.debug("debug test"); 
logger.error("error test"); 

To, co widzę na wyjściu standardowym, to:

ьрщ 14, 2012 5:09:29 PM .....FrontEndServlet doPost 
INFO: info test 
ьрщ 14, 2012 5:09:29 PM .....FrontEndServlet doPost 
SEVERE: error test 

Wygląda na to, że plik konfiguracyjny nie został pobrany. Co robię źle?

Odpowiedz

6

Problem polegał na tym, że sl4j nie odebrał logbacków i zamiast tego używał rejestrowania Slf4j-jdk w Weblogic. Może być ustalona z config WebLogic WebLogic-application.xml, opcja preferują-application-pakiety

6

Uwaga: Również na to pytanie już udzielono odpowiedzi, chcę dodać, że należy również dodać prefer-application-resources.

Odpowiedź: Dodaj plik o nazwie META-INF/WebLogic-application.xml do ucha, zawierająca zarówno prefer-application-packages i prefer-application-resources!

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-application 
     xmlns="http://xmlns.oracle.com/weblogic/weblogic-application" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.5/weblogic-application.xsd" 
     version="6"> 

    <!-- http://www.torsten-horn.de/techdocs/jee-oracleweblogic.htm --> 
    <prefer-application-packages> 
     <package-name>org.slf4j.*</package-name> 
    </prefer-application-packages> 


    <!-- if not using prefer-application-resources you will get a warning like this: --> 
    <!-- Class path contains multiple SLF4J bindings --> 
    <!-- SLF4J: Found binding in [jar:file:/C:/wls1211/modules/org.slf4j.jdk14_1.6.1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] --> 
    <prefer-application-resources> 
     <resource-name>org/slf4j/impl/StaticLoggerBinder.class</resource-name> 
    </prefer-application-resources> 


</weblogic-application> 
+1

Wyjaśnienie, w jaki sposób i jakiego pliku należy użyć, jest bardzo jasne. Dziękuję Ci! – ferreirabraga

0

Alternatywnie lub jeśli masz problemy z więcej niż tylko slf4j, można użyć

<wls:container-descriptor> 
    <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes> 
</wls:container-descriptor> 

Zamiast

<prefer-application-packages> 
    <package-name>org.slf4j.*</package-name> 
</prefer-application-packages> 

Źródło: Oracle

0

Środowisko: Weblogic 12.2 .1 Rejestrowanie Ramowa: slf4j i Logback Wymagania: Logowanie do pliku mojego wyboru (w przypadku stosowania), a także logi serwera Weblogic

Używanie <prefer-application-packages/> lub <prefer-web-inf-classes> w weblogic.xml nie spełnia wymogu. W moich testach użycie jednego lub drugiego znacznika (nie można użyć obu) spowoduje, że aplikacja logback.xml zostanie pobrana, a rejestracja przejdzie do pliku zdefiniowanego w logback.xml. Jednak typowe zdefiniowanie STDOUT przy użyciu logback's ConsoleAppender nie będzie logować się do logów serwera.

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 

Usunięcie następujących elementów z weblogic.xml

<wls:prefer-application-packages> 
    <wls:package-name>org.slf4j.*</wls:package-name> 
</wls:prefer-application-packages> 

spowoduje wykorzystanie powiązanego powiązania SLF4j, które w Weblogic 12.2.1 jest protokołem Java Util. W takim przypadku instrukcje dziennika będą przesyłane do dzienników serwera, a nie do definicji pliku na poziomie logback.xml aplikacji. W moich badaniach wydaje się, że w pewnym momencie, niektóre wersje Weblogic 12 pozwoliły wewnętrznemu SLF4j związać się z Log4j, ale zostały usunięte w jednym z mniejszych wydań. To był mój przypadek; Nie miałem możliwości włączenia Log4j jako podstawowej struktury logowania w Weblogic w konsoli administracyjnej. Jestem pewien, że to by mi nie pomogło, ale chciałem to zauważyć, ponieważ wiele dokumentów, które przeczytałem, wskazywało na to.

Po wielu badaniach i konfiguracji bojowej z weblogic.xml, konfiguracją POM (wykluczeniami itp.) I próbą użycia różnych wiązań i mostów, nie udało mi się osiągnąć wymaganej konfiguracji rejestrowania. Wygląda na to, że slf4j w Weblogic jest związany z logowaniem się do Java na lepsze lub gorsze. Jeśli wybierzesz własną implementację slf4j i bindowania (w moim przypadku Logback), nie ma możliwości, żebym mógł znaleźć te komunikaty do logów serwera Weblogic poprzez konfigurację. W slf4j może być tylko jedno wiązanie i chociaż wiele frameworków może być routowanych do tego wiązania, (znalazłem użyteczny diagram this) Weblogic 12.2.1 stosuje tylko logowanie logiczne Java, nie ma sposobu (na poziomie konfiguracji aplikacji) do połączenia Weblogic, aby użyć powiązania Logback, które podajesz, aby logować się do jego dzienników serwera. Może być jakiś sposób użycia log4j i mostów, aby to osiągnąć, ale dla mnie jest to za dużo za dużo i konfiguracja do wykonania prostego zadania rejestrowania.

Rezygnując z próby opanowania tego przez konfigurację, zdecydowałem się po prostu napisać mojego własnego dostawcę logback, który tłumaczy zdarzenie rejestrowania na zdarzenie rejestrowania JUL. Zastąpiłem standardową definicję STDOUT widoczną w wielu przykładach Logback z moją wersją own implementacji AppBookBase firmy Logback. W tym momencie mogę teraz logować za pomocą konfiguracji rejestrowania aplikacji, a także zalogować się do dziennika serwera Weblogic.

Istotne Zależności POM:

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.25</version> 
    </dependency> 
    <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
    <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core --> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-core</artifactId> 
     <version>1.2.3</version> 
    </dependency> 

weblogic.xml (Zauważmy, że Hibernate wyposażony JbossLogging która będzie pomostem do automatycznego slf4j) realizację

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" 
xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/2.0/weblogic-web-app.xsd"> 
<jsp-descriptor> 
    <keepgenerated>true</keepgenerated> 
    <debug>true</debug> 
</jsp-descriptor> 
<context-root>YourContextRoot</context-root> 
<wls:container-descriptor> 
    <wls:prefer-application-packages> 
     <wls:package-name>ch.qos.logback.*</wls:package-name> 
     <wls:package-name>org.jboss.logging.*</wls:package-name> 
     <wls:package-name>org.slf4j.*</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:container-descriptor> 

Logback AppenderBase

import java.util.logging.Logger; 

import ch.qos.logback.classic.spi.ILoggingEvent; 
import ch.qos.logback.core.AppenderBase; 

public class WeblogicAppender extends AppenderBase<ILoggingEvent> { 

private final Logger logger = Logger.getLogger(WeblogicAppender.class.getName()); 
ILoggingEvent event = null; 

@Override 
protected void append(ILoggingEvent event) { 
    this.event = event; 
    logger.log(getJULLevel(), event.getFormattedMessage()); 
} 

private java.util.logging.Level getJULLevel() { 

    if (this.event == null) { 
     return java.util.logging.Level.SEVERE; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.ALL) { 
     return java.util.logging.Level.ALL; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.DEBUG) { 
     return java.util.logging.Level.FINE; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.ERROR) { 
     return java.util.logging.Level.SEVERE; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.INFO) { 
     return java.util.logging.Level.INFO; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.TRACE) { 
     return java.util.logging.Level.FINEST; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.WARN) { 
     return java.util.logging.Level.WARNING; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.OFF) { 
     return java.util.logging.Level.OFF; 
    } else { 
     return java.util.logging.Level.INFO; 
    } 
} 

}

konfiguracja Logback.xml

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
<appender name="STDOUT" class="com.your.package.WeblogicAppender"> 
    <encoder> 
     <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger: LineNumber:%L - %message%n</pattern> 
    </encoder> 
</appender> 
<appender name="FILE" 
    class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>yourlog.log 
    </file> 
    <rollingPolicy 
     class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 
     <fileNamePattern>yourlog.%d{yyyy-MM-dd}.%i.log 
     </fileNamePattern> 
     <maxFileSize>25MB</maxFileSize> 
     <maxHistory>60</maxHistory> 
     <totalSizeCap>10GB</totalSizeCap> 
    </rollingPolicy> 
    <encoder> 
     <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger: LineNumber:%L - %message%n</pattern> 
    </encoder> 
</appender> 

<root level="TRACE"> 
    <appender-ref ref="STDOUT" /> 
    <appender-ref ref="FILE" /> 
</root> 
</configuration> 

Mam nadzieję, że mogę ratować innych niektóre z bólem, że przeszedł próbując dostać tę pracę tak, jak chciałem.