2009-05-15 10 views
82

Tengo una aplicación existente que hace todo su registro contra log4j. Usamos varias 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 registra contra slf4j, que también funciona bien ya que eventualmente delega a log4j también.Cómo enviar java.util.logging a 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 funcionarían perfectamente en este escenario, pero a partir del version 1.6-beta1 han eliminado la dependencia de commons-logging y la han reemplazado con java.util.logging.

No estoy realmente familiarizado con el registro JDK incorporado disponible con java.util.logging, ¿hay alguna manera fácil de tener cualquier mensaje de registro enviado a JUL conectado contra log4j, para que pueda usar mi configuración existente y configurarlo? para cualquier registro proveniente de ehcache?

En cuanto a los javadocs para JUL, parece como si pudiera establecer un grupo de variables de entorno para cambiar el LogManager aplicación se utiliza, y tal vez usar eso para envolver log4j Logger s en la clase JUL Logger. ¿Es este el enfoque correcto?

Un poco irónico que el uso de una biblioteca de registro JDK incorporado causaría tal dolor de cabeza cuando (la mayoría de) el resto del mundo esté utilizando bibliotecas de terceros.

Respuesta

36

Un enfoque que he utilizado con éxito es utilizar slf4j como mi principal API de registro. Luego tengo slf4j vinculado a log4j. Las dependencias de terceros que usan otros marcos (como JUL) pueden ser bridged a slf4j.

+2

Buen enlace, pero creo que quería decir #-Jul-a slf4j – araqnid

+0

Buena captura. He actualizado la respuesta en consecuencia. ¡Gracias! – overthink

+0

Esto suena como un buen enfoque, excepto que parece que no puedo hacer que funcione :( –

3

El sitio slf4j creo que 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 los registros a SLF4J.

+0

http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j –

18

Utilizamos 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 de SLF4J directamente, y configuramos SLF4J para que las llamadas de las API Jakarta Commons Logging (JCL), java.util.logging (JUL) y Log4J estén conectadas a las API de SLF4J. Necesitamos hacer eso porque, como usted, utilizamos bibliotecas de terceros (código abierto) que han elegido diferentes API de registro.

En la parte inferior de SLF4J, configúrelo para usar una implementación de registrador particular. Viene con un registrador interno o "simple" y puede anular esto con Log4J, JUL o Logback. La configuración se hace simplemente colocando diferentes archivos jar en su classpath.

Originalmente, utilizamos la implementación de Logback, también escrita por Ceki Gülcü. Esto es muy poderoso Sin embargo, decidimos implementar nuestra aplicación en el servidor de aplicaciones Glassfish Java EE, cuyo visualizador de registros espera mensajes con formato JUL. Así que hoy cambié de Logback a JUL, y en solo unos minutos reemplacé dos jarrones Logback con un jar SLF4J que lo conecta a la implementación JUL.

Así que, como @overthink, recomendaría utilizar SLF4J en su configuración.

+7

¿Cuántas veces necesita Ceki reinventar un marco de trabajo/fascade? –

+0

@mP: El registro puede no ser glamuroso, pero es una necesidad crucial para el software comercial a gran escala. Y SLF4J resuelve el problema de la integración de código que usa marcos de registro dispares (lo cual hace más urgente el hecho de que Sun elija desarrollar java.utils.logging en lugar de adoptar Log4J). –

+3

@mP, slf4j era necesario porque el mal trabajo que Sun hizo con JUL. Logback es un fork de log4j, no es un proyecto nuevo. –

2

@Yishai - Gracias por publicar el enlace a mi wiki. El ejemplo allí redirige JUL a Log4J y lo he estado ejecutando en un sistema de producción durante algunos años. JBoss 5.x ya redirecciona JUL a Log4J, así que lo saqué cuando lo actualizamos.Tengo uno más nuevo que redirige a SLF4J, que uso en algunas cosas ahora. Lo publicaré cuando tenga oportunidad.

Sin embargo, SLF4J ya lo tiene:

http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j

12

Hay una alternativa más simple que SLF4J para cerrar julio con log4j, ver http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html

Sólo hay que poner el-log4j-puente julio en la ruta de clase y añadir una propiedad del sistema:

-Djava.util.logging.manager=org.apache.logging.julbridge.JULBridgeLogManager 

Jul-log4j-puente no está en Maven central y puede b e inverosímil 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 utilizar 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:

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. edite pom.xml, reemplace la dependencia de log4j: log4j: 1.2.15 con log4j: apache-log4j-extras: 1.2.17 y elimine la dependencia de apache-log4j-compon ent
  3. mvn package
+0

No es más sencillo si ya usas SLF4J. :) –

+3

Creo que es más simple porque se puede hacer sin cambiar el código, solo tiene que agregar una propiedad del sistema. SLF4J aún no propone un mecanismo similar, ya sea que cambie el código o el archivo 'logging.properties'. –

+1

Esto no existe en log4j2, desafortunadamente :( – BeepDog

Cuestiones relacionadas