Tengo una aplicación existente que hace todo su registro contra log4j. Usamos una serie de otras bibliotecas que también usan log4j, o registran contra Commons Logging, que termina usando log4j bajo las cubiertas de nuestro entorno. Una de nuestras dependencias incluso se registra en slf4j, que también funciona bien ya que eventualmente también delega en log4j.
Ahora, me gustaría agregar ehcache a esta aplicación para algunas necesidades de almacenamiento en caché. Las versiones anteriores de ehcache usaban commons-logging, que habría funcionado perfectamente en este escenario, pero a partir de la versión 1.6-beta1 eliminaron la dependencia de commons-logging y la reemplazaron con java.util.logging en su lugar.
Al no estar realmente familiarizado con el registro JDK integrado disponible con java.util.logging, ¿existe una manera fácil de que los mensajes de registro enviados a JUL se registren en log4j, para que pueda usar mi configuración existente y configurar para cualquier registro que venga? de ehcache?
Mirando los javadocs para JUL, parece que podría configurar un montón de variables de entorno para cambiar qué LogManager
implementación se usa, y tal vez usar eso para ajustar log4j Logger
s en la Logger
clase JUL . ¿Es este el enfoque correcto?
Es un poco irónico que el uso de un registro JDK integrado en una biblioteca cause un dolor de cabeza cuando (la mayoría) el resto del mundo está usando bibliotecas de terceros.
Usamos SLF4J en nuestro proyecto actual y nos ha funcionado muy bien. SLF4J está escrito por Ceki Gülcü, el creador de Log4J, y ha hecho un gran trabajo. En nuestro código usamos las API de registro SLF4J directamente, y configuramos SLF4J para que las llamadas desde las API de Jakarta Commons Logging (JCL), java.util.logging (JUL) y Log4J se conecten con las API de SLF4J. Necesitamos hacer eso porque, al igual que usted, usamos bibliotecas de terceros (código abierto) que han elegido diferentes API de registro.
En la parte inferior de SLF4J, lo configura para usar una implementación de registrador particular. Viene con un registrador interno o "simple", y puede anularlo con Log4J, JUL o Logback . La configuración se realiza simplemente colocando diferentes archivos jar en su classpath.
Originalmente, usamos la implementación Logback, también escrita por Ceki Gülcü. Esto es muy poderoso. Sin embargo, luego decidimos implementar nuestra aplicación en el servidor de aplicaciones Glassfish Java EE, cuyo visor de registros espera mensajes con formato JUL. Así que hoy cambié de Logback a JUL, y en solo unos minutos reemplacé dos frascos de Logback con un frasco SLF4J que lo conecta a la implementación de JUL.
Así que como @overthink, recomiendo encarecidamente usar SLF4J en su configuración.
fuente
Existe una alternativa más simple que SLF4J para unir JUL con log4j, consulte http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html
Solo tiene que poner jul-log4j-bridge en la ruta de clase y agregar una propiedad del sistema:
jul-log4j-bridge no está en Maven Central y se puede obtener de este repositorio:
<repository> <id>psmith</id> <url>http://people.apache.org/~psmith/logging.apache.org/repo</url> <releases> <enabled>false</enabled> </releases> </repository>
y luego se usa con:
<dependency> <groupId>org.apache.logging</groupId> <artifactId>apache-jul-log4j-bridge</artifactId> <version>1.0.0-SNAPSHOT</version> <scope>test</scope> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>apache-log4j-component</artifactId> </exclusion> </exclusions> </dependency>
También es posible reconstruirlo a partir de fuentes con los siguientes pasos:
fuente
logging.properties
archivo.JulLog4jBridge.assimilate();
o_0jul-log4j-bridge
usa elapache-log4j-companions
paquete nunca lanzado (un backport del abandonadolog4j 1.3
). Te resultará difícil construirlo. Naturalmente, el puente en sí también se abandonó antes del lanzamiento.Octubre de 2014
Desde la versión 2.1 de log4j existe el componente log4j-jul, que permite exactamente esto. Aún así, en caso de que esté utilizando log4j 1, debe ser posible actualizar a log4j2 para poder utilizar este enfoque.
Adaptador de registro JDK
Class LogManager
Migrar de log4j 1.xa log4j 2
fuente
Creo que el sitio slf4j tiene un puente para pasar eventos java.util.logging a través de slf4j (y por lo tanto a log4j).
Sí, la descarga de SLF4J contiene jul-to-slf4j que creo que hace precisamente eso. Contiene un controlador JUL para pasar registros a SLF4J.
fuente
@Yishai - Gracias por publicar el enlace a mi wiki. El ejemplo allí redirige a JUL a Log4J y lo he tenido funcionando en un sistema de producción durante algunos años. JBoss 5.x ya redirige JUL a Log4J, así que lo eliminé cuando actualizamos. Tengo uno más nuevo que redirige a SLF4J, que ahora uso en algunas cosas. Publicaré eso cuando tenga la oportunidad.
Sin embargo, SLF4J ya lo tiene:
http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j
fuente
debe agregar manualmente sopló al inicio
demostración -> https://gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d
fuente