2012-03-16 18 views
11

Stiamo costruendo un nuovo systen usando slf4j come facciata di registrazione. Quando si distribuiscono sulla nuova Weblogic 12c, abbiamo trovato questo errore sul log della console:Impedire a Weblogic 12c di utilizzare il binding slf4j del sistema

SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in [jar:file:/opt/Oracle/Middleware2/modules/org.slf4j.jdk14_1.6.1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: Found binding in [zip:/opt/Oracle/Middleware2/user_projects/domains/m3/servers/AdminServer/tmp/_WL_user/test/t030q4/war/WEB-INF/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class] 

dopo googling, abbiamo trovato che questo è solo un avvertimento, slf4j legherà prima trovato logger, che in questo caso è quadro logger di sistema di weblogic . C'è un modo per farlo legare al framework di registrazione nel nostro file WAR? Preferire le classi inf-web > in weblogic.xml non aiuta

risposta

0

Non credo che SLF4J fornisca un modo per forzare la propria versione, poiché si basa sull'auto-scoperta nel classpath.

Quindi, se si dispone dei diritti di amministrazione su WebLogic, la soluzione più semplice consiste nell'aggiornare la versione SLF4J di WebLogic alla 1.6.4 aggiornando il file nella cartella di installazione di WebLogic.

In caso contrario, si può provare a costruire un EAR, invece di una guerra e di seguire le raccomandazioni here, anche se dubito che funzionerà se preferiscono-WEB-INF-classi non funziona in una guerra.

+0

eh, quello che voglio dire è "make logger di bind slf4j per loggare la libreria fornita da me invece di legarsi alla libreria di sistema". Ciò non è correlato alla versione di slf4j, dal momento che passa a 1.6.1 questo errore si verifica e, secondo il documento di slf4j, quando slf4j trova più logger associabili, si collegherà al primo logger, che è sempre il binding slf44 del sistema – dhchen

2

Avevamo anche questo problema e dal momento che ci viene richiesto di configurare la registrazione tramite Log4J questo era un problema. Tuttavia, utilizzando prefer-application-packages sembra funzionare finora, cioè mettendo un file weblogic-application.xml nella cartella META-INF dell'EAR con il seguente:

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-application.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd" > 
    <prefer-application-packages> 
     <package-name>org.slf4j</package-name> 
    </prefer-application-packages> 
</weblogic-application> 

(ok xmlns specificati è un vecchio ma funziona, potete aggiornarlo se vuoi, ho appena preso la nostra e rimosso le parti non correlate).

Abbiamo ancora l'avvertimento di cui sopra ma utilizza Log4J come richiesto. In realtà, se si guarda al the URL specified on the next line nei log (omesso qui in questione), si dice:

L'avvertimento emesso dal SLF4J è proprio questo, un avvertimento. SLF4J continuerà a legare con il primo framework che trova sul percorso della classe.

Quindi credo che utilizza ancora il meccanismo delle classi di carico normale per il carico org.slf4j.impl.StaticLoggerBinder, che abbiamo effettivamente configurato a preferire l'uno nella nostra EAR (vale a dire lo rendono il primo nel classpath).

Tuttavia, l'avviso rimane ma funziona. La correzione dell'avviso sarebbe buona ma probabilmente non possibile senza alterare le librerie fornite da WebLogic.

4

Per il file WAR è necessario utilizzare prefer-application-packages in weblogic.xml come descritto nei post this e this.

Nel tuo caso sarà qualcosa di simile a

<?xml version="1.0" encoding="UTF-8"?> 
<wls: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://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"> 
    <wls:container-descriptor> 
     <wls:prefer-application-packages> 
      <wls:package-name>org.slf4j</wls:package-name> 
     </wls:prefer-application-packages> 
    </wls:container-descriptor> 
</wls:weblogic-web-app> 
27

Il filtro non dovrebbe essere fatto su classi, ma sulle risorse, perché SLF4J cerca il StaticLoggerBinder.class come una risorsa e non come una classe.

Includilo nella tua applicazione weblogic.xml:

<wls:prefer-application-packages> 
    <wls:package-name>org.slf4j.*</wls:package-name> 
    <wls:package-name>org.apache.commons.*</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> 

e il tuo logger verrà utilizzato al posto di quello all'interno del System Class Loader.

+3

è org.apache. comuni. * è richiesta l'iscrizione per far funzionare SLF4J? Se è così, perché? –

+0

pochi giorni di ritardo ma: com.apache.commons.logging. * – HRgiger

Problemi correlati