2012-05-14 15 views
12

Sto provando a configurare sl4j/logback su Weblogic12. schiero file ear, che ha file di guerra, che ha WEB-INF \ Classes \ logback.xml
Ecco la configurazione: sl4j/logback in 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> 

Il mio codice di registro:

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

Quello che vedo nell'output standart è:

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

Quindi, sembra che il file di configurazione non venga prelevato. Cosa sto sbagliando?

risposta

6

Il problema era: sl4j non ha raccolto il logback e ha utilizzato invece la registrazione slf4j-jdk di Weblogic. Può essere fissato con configurazione di Weblogic weblogic-application.xml, opzione preferisca, applicazione-packages

6

Nota: Anche questa domanda ha già una risposta, voglio aggiungere che è necessario aggiungere anche prefer-application-resources.

Risposta: Aggiungere un file chiamato META-INF/weblogic-application.xml all'orecchio, contenente sia prefer-application-packages e 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

È molto chiaro quando si spiega come e quale file è necessario utilizzare. Grazie! – ferreirabraga

0

In alternativa o se hai problemi con più di un semplice slf4j, si potrebbe usare

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

Invece di

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

Fonte: Oracle

0

Ambiente: Weblogic 12.2 .1 Registrazione Quadro: SLF4J e Logback Requisito: Accedere a un file di mia scelta (per applicazione), così come i log del server Weblogic

Utilizzando il <prefer-application-packages/> o <prefer-web-inf-classes> in weblogic.xml non soddisfa il requisito. Nei miei test, l'utilizzo di uno o degli altri tag (non è possibile utilizzare entrambi) comporterà il ritiro del logback.xml dell'applicazione e la registrazione verrà eseguita nel file definito in logback.xml. Tuttavia, la tipica definizione di STDOUT che utilizza ConsoleAppender di logback non effettuerà il log dei log del server.

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

Rimozione del seguente da weblogic.xml

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

comporterà utilizzando il bundle SLF4J vincolante, che in Weblogic 12.2.1, è la registrazione Java Util. In questo caso, le istruzioni del registro andranno ai log del server e non alla definizione del file nel livello logback.xml dell'applicazione. Nella mia ricerca, appare in una sola volta, alcune versioni di Weblogic 12 hanno permesso che l'SLF4j interno fosse associato a Log4j, ma è stato rimosso in una delle versioni minori. Questo era il mio caso; Non avevo la possibilità di abilitare Log4j come framework di registrazione primario in Weblogic tramite la Console di amministrazione. Sono abbastanza sicuro che questo non mi avrebbe aiutato, ma ho voluto prenderlo perché molti documenti che ho letto indicavano che questo sarebbe disponibile.

Dopo molte ricerche e configurazioni di combattimento con weblogic.xml, configurazione di POM (esclusioni ecc.) E tentativo di utilizzare diversi collegamenti e bridge, non sono riuscito a ottenere la configurazione di registrazione che volevo. Sembra che lo slf4j di Weblogic sia associato alla registrazione dell'utilità Java, nel bene o nel male. Se si sceglie la propria implementazione di slf4j e binding (nel mio caso Logback), non è possibile trovare per instradare quei messaggi ai log del server Weblogic attraverso la configurazione. Ci può essere solo un legame in slf4j, e anche se molti framework possono essere indirizzati a quel binding, (ho trovato utile il diagramma this) Weblogic 12.2.1 utilizza solo l'associazione Java logging, non c'è modo di (a livello di configurazione dell'applicazione) per collegare Weblogic per utilizzare l'associazione Logback fornita per accedere ai relativi log del server. Ci potrebbe essere un modo per usare log4j e bridge per realizzare questo, ma per me è tutto troppo gonfio e configurazione per realizzare una semplice attività di logging.

Rinunciare a cercare di conquistare questo per la configurazione, ho deciso di scrivere semplicemente la mia appender logback che traduce un evento di registrazione in un evento di registrazione luglio Ho sostituito la definizione standard di STDOUT vista in molti esempi di logback con la mia implementazione own di AppenderBase di Logback. A questo punto posso ora effettuare il log utilizzando la configurazione di registrazione per applicazione e accedere al log del server Weblogic.

dipendenze POM rilevanti:

<!-- 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 (Si noti qui che Hibernate viene con JbossLogging che da ponte SLF4J automaticamente) attuazione

<?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; 
    } 
} 

}

configurazione 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> 

Spero di poter salvare gli altri un po 'del dolore che ho passato cercando di ottenere questo lavoro nel modo che volevo.

Problemi correlati