¿Enviar / redireccionar / enrutar java.util.logging.Logger (JUL) a Logback usando SLF4J?

¿Es posible tener una llamada típica a java.util.logging.Logger y ¿tiene una ruta a Logback usando SLF4J? Esto sería bueno ya que no tendría que refactorizar el antiguo código jul línea por línea.

Por ejemplo, digamos que tenemos esta línea:

private static Logger logger = Logger.getLogger(MahClass.class.getName());
//...
logger.info("blah blah blah");

Sería bueno configurar esto para llamar a través de SLF4J.

preguntado el 16 de mayo de 11 a las 16:05

Sí, es posible. Y es muy fácil, no tienes que cambiar ningún código fuente. Solo debe cambiar algunas bibliotecas .jar. Mira estos artículos - registro-con-slf4j - registro heredado - Registro SLF4J -

Hay un beneficio importante al morder la bala y refactorizar a slf4j. Es decir, que puede usar {} en sus cadenas para retrasar las llamadas a toString (). -

¿ToString () es realmente una preocupación con las JVM modernas? Me doy cuenta de que es más eficiente evitar las llamadas a toString (), pero tengo entendido que la creación de objetos es barata y que esto se consideraría una optimización prematura. -

sí, realmente es una preocupación si está haciendo declaraciones de registro enriquecidas. perfilar un sistema de producción en 2015 en un jvm moderno, las llamadas innecesarias para crear cadenas para declaraciones de depuración que no están realmente habilitadas en producción es un punto de acceso de la CPU para el sistema de producción. -

1 Respuestas

Es muy fácil y ya no es un problema de rendimiento.

Hay dos formas documentadas en el SLF4J manual. También hay ejemplos precisos en el Javadocs

Agregue jul-to-slf4j.jar a su classpath. O a través de la dependencia de maven:

<dependency>
    <groupId>org.slf4j</groupId>
     <artifactId>jul-to-slf4j</artifactId>
    <version>1.7.0</version>
</dependency>

Si no tiene logging.properties (para java.util.logging), agregue esto a su código de arranque:

SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();

Si tiene logging.properties (y desea conservarlo), agréguelo:

handlers = org.slf4j.bridge.SLF4JBridgeHandler

Para evitar la penalización del rendimiento, agregue este contextListener a logback.xml (a partir de la versión de logback 0.9.25):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <!-- reset all previous level configurations of all j.u.l. loggers -->
        <resetJUL>true</resetJUL>
    </contextListener> 

    ...

</configuration>

Respondido 06 ago 18, 02:08

Solo una nota: tuve que volver a cargar la configuración de Logback para que esto funcionara para mí. - Bartosz Firyn

De todos modos, era necesario agregar la configuración de contextListener para propagar la configuración de inicio de sesión al registrador de julio. Entonces, independientemente de la mejora del rendimiento, era necesario para nosotros. - Brice

Puede estar relacionado con ese error de alguna manera: jira.qos.ch/browse/LOGBACK-404 es decir, sin el propagador Logger no se guardan y luego se restablecen su nivel. - Brice

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.