obtiene logger log definido crear conversionpattern configurar clase archivo configuration log4j war ear

configuration - definido - logger log4j java



¿Cómo configurar múltiples log4j para diferentes guerras en un solo EAR? (4)

Tengo un EAR con estructuras como:

APP.ear - APP1.war - WEB-INF/classes/log4j.properties - APP2.war - WEB-INF/classes/log4j.properties - app1-ejb.jar - app2-ejb.jar - log4j.jar - spring.jar - commons-lang.jar (...and other jar)

Quiero que cada WAR tenga su propio registro de aplicaciones. Pero parece que la configuración anterior no funciona. El registro para APP1 y APP2 va al registro de APP1. ¿Hay alguna forma de crear registros de aplicaciones separados?


La razón por la que no funcionó porque el log4j está presente en la ubicación raíz, en cambio, cada guerra tiene un Log4j.jar en su directorio WEB-INF / lib y elimina el log4j.jar de la raíz.

Para obtener más información sobre esto, consulte el artículo de mi blog en este http://techcrawler.wordpress.com/


Logback es una solución viable para abordar este problema. Después de buscar alrededor de diferentes hacks para que esto funcione con log4j, hemos decidido cambiar a Logback. He utilizado la siguiente configuración con Logback jar dentro de la aplicación web.

Un archivo de Logback dentro de la aplicación web que incluye un archivo externo:

<?xml version="1.0" encoding="UTF-8" ?> <configuration scan="true" scanPeriod="10 seconds"> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <contextName>${project.artifactId}</contextName> <jmxConfigurator /> <include file="${logback.configuration.filepath}" /> </configuration>

${logback.configuration.filepath} se reemplaza durante el filtrado de Maven por la ruta exacta, externa a la aplicación web del archivo de configuración (algo así como /opt/server/conf/loback.included.conf ).

Y luego, el contenido de logback.included.conf (este archivo es parte del proyecto, entregado con build-helper:attach-artifact , por lo que ${project.artifactId} también se reemplaza durante el filtrado de Maven):

<?xml version="1.0" encoding="UTF-8" ?> <included> <appender name="file" class="ch.qos.logback.core.FileAppender"> <file>/var/log/server/${project.artifactId}.log</file> <encoder> <pattern>[@/%contextName] %date{ISO8601} [%-5level] %thread:[%logger] %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="file" /> </root> </included>

Solo limitación, el contenido del archivo incluido debe ser compatible con el del incluido. Solo estoy escribiendo reglas de hecho.


Resulta que es imposible debido al cargador de clases. La jerarquía del cargador de clases es como:

Application classloader -> Ejb classloader -> war classloader

Para tener un log de sepearte para una guerra individual, uno puede poner log4j.jar dentro de war y dejar que log4j use el warloader de clases. Pero como tanto app1-ejb.jar como app2-ebj.jar también necesitan usar log4j, log4j.jar solo puede colocarse en el nivel superior. Entonces el log4j está en el nivel del cargador de clases de la aplicación.

Puedo especificar una sola configuración de log4j para registrar diferentes paquetes en diferentes archivos. Pero para la biblioteca común como la primavera, el registro no se puede separar.


También puede hacerlo cambiando dinámicamente la propiedad FILE en el archivo de propiedades utilizando el PropertyConfigurator en el código.