Cómo enviar java.útil.iniciar sesión en log4j?


Tengo una aplicación existente que hace todo su registro contra log4j. Usamos una serie de otras bibliotecas que también usan log4j, o log contra Commons Logging, que termina usando log4j bajo las cubiertas en 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é. Versiones anteriores de ehcache usaban commons-logging, lo que hubiera funcionado 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 con java.útil.registrando en su lugar.

No estoy realmente familiarizado con el registro JDK integrado disponible con java.útil.registro, ¿hay una manera fácil de tener cualquier mensaje de registro enviado a JUL registrado en log4j, para que pueda usar mi configuración existente y configurar para cualquier registro proveniente de ehcache?

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

Es un poco irónico que el uso de una biblioteca de registro JDK incorporado causaría un dolor de cabeza cuando (la mayoría) el resto del mundo está utilizando bibliotecas de terceros en su lugar.

Author: Jim Ferrans, 2009-05-15

7 answers

Un enfoque que he utilizado con éxito es usar slf4j como mi API de registro principal. Luego tengo que enlazar slf4j a log4j. las dependencias de terceros que usan otros frameworks (como JUL) pueden ser puenteadas a slf4j.

 36
Author: overthink,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-15 17:59:53

Usamos SLF4J en nuestro proyecto actual y ha funcionado muy bien para nosotros. SLF4J está escrito por Ceki Gülcü, el creador de Log4J, y ha hecho un gran trabajo. En nuestro código utilizamos las API de registro SLF4J directamente, y configuramos SLF4J para que las llamadas desde el Jakarta Commons Logging (JCL), java.útil.logging (JUL), y Log4J Las API están conectadas a las API SLF4J. Tenemos que hacer eso porque al igual que usted utilizamos bibliotecas de terceros (de código abierto) que han elegido diferentes API de registro.

En la parte inferior de SLF4J, lo configura para usar una implementación de logger en particular. Viene con un logger interno, o "simple", y puede anular esto 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 Glassfish Servidor de aplicaciones Java EE, cuyo visor de registros espera mensajes con formato JUL. Así que hoy cambié de Logback a JUL, y en solo unos minutos reemplazé dos tarros de Logback con un tarro SLF4J que lo conecta a la implementación de JUL.

Así que al igual que @overthink, recomiendo encarecidamente usar SLF4J en su configuración.

 18
Author: Jim Ferrans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-24 03:34:45

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

Solo tienes que poner el jul-log4j-bridge en el classpath y añadir una propiedad del sistema:

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

Jul-log4j-bridge no está en Maven Central y se puede obtener desde 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 desde fuentes con lo siguiente pasos:

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge /
  2. editar 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
 12
Author: Emmanuel Bourg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-30 08:26:31

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

Adaptador de registro JDK

Class LogManager

Migrar desde log4j 1.x a log4j 2

 6
Author: AdrianRM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-10 14:47:17

El sitio slf4j creo que tiene un puente para pasar java.útil.registro de eventos 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.

 3
Author: araqnid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-15 17:48:14

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

Sin embargo, SLF4J ya lo tiene:

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

 2
Author: Joshua Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-21 17:36:19

Usted debe agregar manualmente sopló en el inicio

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

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

 0
Author: jiahut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-09 10:00:36