¿Cómo enviar java.util.logging a log4j?

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.

Ahora, me gustaría agregar ehcache a esta aplicación para algunas necesidades de almacenamiento en caché. Las versiones anteriores de ehcache utilizaban commons-logging, que funcionarían perfectamente en este escenario, pero a partir de la versión 1.6-beta1 han eliminado la dependencia de commons-logging y la han reemplazado por java.util.logging.

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

En cuanto a los javadocs para JUL, parece que podría configurar un grupo de variables de entorno para cambiar qué implementación de LogManager se usa, y tal vez usar eso para envolver log4j Logger s en la clase JUL Logger . ¿Es este el enfoque correcto?

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

Un enfoque que he utilizado con éxito es usar slf4j como mi principal API de registro. Luego tengo slf4j vinculado a log4j. Las dependencias de terceros que utilizan otros marcos (como JUL) se pueden puentear a slf4j.

Usamos SLF4J en nuestro proyecto actual y nos funcionó 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 desde el Registro de Commons de Jakarta (JCL), API de 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, lo configura 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, usamos 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 usar SLF4J en su configuración.

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

Solo tiene que poner jul-log4j-bridge en classpath y agregar una propiedad del sistema:

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

jul-log4j-bridge no está en Maven Central y se puede buscar desde este repository:

  psmith http://people.apache.org/~psmith/logging.apache.org/repo  false   

y luego se usa con:

  org.apache.logging apache-jul-log4j-bridge 1.0.0-SNAPSHOT test   log4j apache-log4j-component    

También es posible reconstruirlo desde las fonts 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-component
  3. paquete mvn

OCTUBRE 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, tiene que ser posible actualizar a log4j2 para usar este enfoque.

Adaptador de registro JDK

Clase LogManager

Migrar de log4j 1.x a log4j 2

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 SLF4J contiene jul-to-slf4j, que creo que hace precisamente eso. Contiene un controlador JUL para pasar los registros a SLF4J.

@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

deberías agregar manualmente sopló al inicio

 SLF4JBridgeHandler.removeHandlersForRootLogger() SLF4JBridgeHandler.install() 

demo -> https://gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d