jboss7.x - Logback y Jboss 7: ¿no funcionan juntos?
(3)
Debe excluir la versión de servidores de slf4j de su implementación. Cree un archivo jboss-deployment-structure.xml
y colóquelo en su directorio WARS META-INF
o WEB-INF
.
El contenido del archivo debe verse así:
<jboss-deployment-structure>
<deployment>
<!-- Exclusions allow you to prevent the server from automatically adding some dependencies -->
<exclusions>
<module name="org.slf4j" />
<module name="org.slf4j.impl" />
</exclusions>
</deployment>
</jboss-deployment-structure>
Estoy teniendo un problema curioso. Tenía esta aplicación Java que se implementó previamente en tomcat y utilicé felizmente logback classic como una implementación slf4j. Ahora, cuando tratamos de implementar la misma aplicación en un servidor jboss 7.1.final, ni siquiera despliega la aplicación maoning sobre java.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext
Esta es la línea ofensiva de código
final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
La clase que tiene la suya está inyectada por resorte y está fallando, por lo tanto, no se puede implementar toda la aplicación. Alguien tiene una solución para esto? Gracias por adelantado
Después de buscar en este sitio y en otros foros, me di cuenta de que Jboss 7 viene incluido con su propia implementación slf4j e implementa la misma interfaz ILoggerFactory que LoggerContext en logback. Nuestra aplicación intentó obtener una instancia de la misma, pero el servidor de la aplicación impone su propia implementación slf4j.
Intenté modificar module.xml en jboss / modules / org / slf4j / impl / main y lo apunté a logback jar.
<resources>
<resource-root path="logback-classic-0.9.28.jar"/>
<resource-root path="logback-core-0.9.28.jar"/>
</resources>
Ahora, cuando empiezo la aplicación, recibo un error grave
Exception starting filter WicketFilter: java.lang.ClassCastException: ch.qos.logback.classic.LoggerContext cannot be cast to ch.qos.logback.classic.LoggerContext
Estoy en mi ingenio final. ¿Algún experto en jboss y logback puede ayudar? Gracias por adelantado
Hay un enfoque alternativo:
- tienes registro configurado en tu guerra
- tienes todas las dependencias en tu guerra
- no configura nada en el directorio del servidor JBoss, ni siquiera módulos JBoss adicionales
Simplemente deshabilite el registro de JBoss por completo y confíe en las dependencias de su guerra . Edite su jboss-deployment-structure.xml
siguiente manera:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
<deployment>
<exclusions>
<module name="org.apache.commons.logging" />
<module name="org.apache.log4j" />
<module name="org.jboss.logging" />
<module name="org.jboss.logging.jul-to-slf4j-stub" />
<module name="org.jboss.logmanager" />
<module name="org.jboss.logmanager.log4j" />
<module name="org.slf4j" />
<module name="org.slf4j.impl" />
<module name="org.slf4j.jcl-over-slf4j" />
</exclusions>
</deployment>
</jboss-deployment-structure>
Una vez que implemente su aplicación, el registro de arranque (boot.log) seguirá funcionando y server.log mostrará el registro de despliegue. Pero toda su aplicación se registra a través de su (en este ejemplo) slf4j + logback en su guerra.
Tenga en cuenta que no debería necesitar ejecutar JBoss con -Dorg.jboss.logging.provider=slf4j
, si especifica esto, deberá proporcionar los módulos de JBoss (normalmente slf4j-api, logback-classic y logback-core), pero no vale la pena el esfuerzo, ya que el registro de JBoss ahora se usa solo para bootstrap (boot.log) y para la información de implementación (server.log).
Referencias
http://tinyapps.blogspot.com/2013/01/getting-logback-and-slf4j-to-work-in.html
https://.com/a/19695680/2587343
Si está utilizando los puentes para jul o jcl en su aplicación, debe excluirlos también:
<module name="org.slf4j" />
<module name="org.slf4j.jcl-over-slf4j" />
<module name="org.slf4j.impl" />
<module name="org.jboss.logging.jul-to-slf4j-stub" />