2012-05-14 29 views
12

Estoy intentando configurar sl4j/logback en Weblogic12. despliego archivo del oído, que tiene archivo de la guerra, que tiene WEB-INF \ classes \ logback.xml
Aquí está el config: sl4j/logback en 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> 

Mi código para iniciar la sesión:

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

Lo que veo en la salida estándar es:

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

Parece que el archivo de configuración no está recogido. ¿Qué estoy haciendo mal?

Respuesta

6

El problema era que sl4j no recogió el logback y usó el registro slf4j-jdk de Weblogic en su lugar. Se fija mediante configuración de Weblogic WebLogic-aplicacion.xml, opción prefer-Application-paquetes

6

Nota: También esta pregunta ya está respondida, quiero agregar que también debe agregar prefer-application-resources.

Respuesta: Añadir un archivo llamado META-INF/weblogic-aplicacion.xml a la oreja, que contiene tanto prefer-application-packages y 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

Está muy claro cuando explica cómo y qué archivo se debe utilizar. ¡Gracias! – ferreirabraga

0

alternativa o si tiene problemas con algo más que slf4j, podría utilizar

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

En lugar de

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

Fuente: Oracle

0

Medio Ambiente: Weblogic 12.2 .1 Registro Marco: SLF4J y Logback Requisito: Registrar en un archivo de mi elección (por aplicación), así como los registros del servidor Weblogic

Utilizando el <prefer-application-packages/> o <prefer-web-inf-classes> en weblogic.xml no cumplir con el requisito. En mis pruebas, el uso de una u otras etiquetas (no se pueden usar ambas) dará como resultado que la aplicación logback.xml se recoja y el registro se destine al archivo definido en logback.xml. Sin embargo, la definición típica de STDOUT que utiliza ConsoleAppender de logback no se registrará en los registros del servidor.

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

Eliminando lo siguiente de weblogic.xml

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

resultará en el uso de la unión SLF4J liado, que en Weblogic 12.2.1, es Java Util registro. En este caso, las instrucciones de registro irán a los registros del servidor y no a la definición del archivo en el nivel de la aplicación logback.xml. En mi investigación, parece que en algún momento, alguna versión de Weblogic 12 permitió que el SLF4j interno se vincule a Log4j, pero se eliminó en uno de los lanzamientos menores. Este era mi caso; No tuve la opción de habilitar Log4j como el Marco de registro principal en Weblogic a través de la Consola de administración. Estoy bastante seguro de que esto no me habría ayudado, pero quise tomar nota porque varios documentos que leí indicaron que esto estaría disponible.

Después de mucha investigación y configuración de lucha con weblogic.xml, configuración de POM (exclusiones, etc.) y tratando de usar diferentes enlaces y puentes, no pude lograr la configuración de registro que quería. Parece que el slf4j de Weblogic está vinculado al registro de utilidades de Java, para bien o para mal. Si elige su propia implementación de slf4j y enlace (en mi caso, Logback), no hay forma de que pueda encontrar la ruta de esos mensajes a los registros del servidor de Weblogic a través de la configuración. Solo puede haber un enlace en slf4j, y aunque muchos frameworks pueden enrutarse a ese enlace (encontré útil el diagrama this). Weblogic 12.2.1 solo emplea el enlace de registro Java util, no hay forma de (en el nivel de configuración de la aplicación)) para conectar Weblogic y usar el enlace de Logback que usted proporciona para iniciar sesión en los registros de su servidor. Puede haber alguna forma de usar log4j y bridges para lograr esto, pero para mí eso es demasiada hinchazón y configuración para lograr una tarea de registro simple.

Renunciándome a tratar de conquistar esto por configuración, decidí simplemente escribir mi propio apéndice de registro que traduce un evento de registro en un evento de registro JUL. Reemplacé la definición estándar de STDOUT que se ve en muchos ejemplos de Logback con mi implementación own de AppenderBase de Logback. En este momento, ahora puedo iniciar sesión utilizando la configuración de registro de la aplicación y también iniciar sesión en el registro de Weblogic Server.

Dependencias POM pertinentes:

<!-- 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 (Nótese aquí que viene con Hibernate JbossLogging que salvar a SLF4J automáticamente) aplicación

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

}

configuración 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> 

espero que pueda salvar a los demás algo del dolor que pasé por tratar de conseguir este trabajo la manera que quería.

Cuestiones relacionadas