2011-05-16 25 views
19

¿Es posible tener una llamada típica a java.util.logging.Logger y lo han 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.¿Enviar/redirigir/enrutar java.util.logging.Logger (JUL) a Logback usando SLF4J?

EG, digamos que tenemos esta línea:

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

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

+0

Hay una ventaja importante al morder la bullet y refactor a slf4j. A saber, puede usar {} en sus cadenas para retrasar llamadas aString(). –

+0

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

+0

sí, realmente es una preocupación si está haciendo ricas declaraciones de registro. perfilando un sistema de producción en 2015 en un jvm moderno, las llamadas innecesarias para crear cadenas para las 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. – simbo1905

Respuesta

13

Sí, es posible. Y es muy fácil, no tienes que cambiar ningún código fuente. Solo debe cambiar algunas bibliotecas .jar.

mirada en este artículo

+6

He aprendido algo hoy. Aún así, esas frases son bastante asquerosas "En consecuencia, j.u.l.a SLF4J traducción puede tener un serio impacto sobre el costo de las declaraciones de registro con discapacidad (60 veces mayor) y un impacto mensurable en las declaraciones de registro habilitados (20% de aumento en general). "y" Tenga en cuenta que para el código fuente bajo su control, que realmente debería usar el slf4j-migrator. Las soluciones basadas en binarios descritos en esta página son adecuadas para el software fuera de su control " –

+0

@Anthony Accioly, grandes puntos a estar seguro de usar sólo el migrador – Zombies

+0

Ver @ respuesta de Dejan:... Uso de LevelChangePropagator evitará el costo de discapacitados la tala – karmakaze

1

Por lo que yo sé que no es posible. Una solución alternativa es usar el Migrator Tool. Puede hacerse cargo de la parte más tediosa de la migración (sustituir las importaciones, reemplace Logger.getLogger con LoggerFactory.getLogger, etc) para usted.

Actualización: Como señaló @ user179437, de hecho es posible. Simplemente no realmente recomendado a menos que no tenga acceso al código fuente.

30

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

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

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

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

Si tiene logging.properties (y quieren mantenerlo), añadir esto a él:

handlers = org.slf4j.bridge.SLF4JBridgeHandler 

En cualquier caso, añadir Jul-a-slf4j.jar a la ruta de clases. Oa través de la dependencia Maven:

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

Con el fin de evitar la pérdida de rendimiento, añadir este contextListener a logback.xml (en la versión 0.9.25 logback):

<?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> 
+0

Sólo una nota -... tenía recargar la configuración de logback para hacer este trabajo para mí –

+0

añadiendo la configuración contextListener era necesario de todos modos para propagar la configuración logback al registrador de julio Así que, independientemente de la mejora del rendimiento era necesario para nosotros – Brice

+0

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

Cuestiones relacionadas