Diferencia entre revisiones de «SLF4J»

De Dos Ideas.
Saltar a: navegación, buscar
(Parametrización de mensajes)
 
(No se muestran 5 ediciones intermedias del mismo usuario)
Línea 17: Línea 17:
 
}
 
}
 
</code>
 
</code>
 +
 +
=== Parametrización de mensajes ===
 +
En [[SLF4J]] es muy facil parametrizar mensajes de log sin realizar concatenaciones:
 +
<code java5>
 +
logger.debug("Mensaje: {}, {}", unObjectoGrande, otroObjetoGrande);
 +
</code>
 +
La serialización a String de los objetos sólo se realizará si el nivel de log es el indicado, y se ubicarán en orden como reemplazo de las llaves. Este mecanismo de log es elegante y muy eficiente, porque [[SLF4J]] demora la construcción del mensaje final de log hasta que realmente sea necesario.
  
 
== Migración de Log4J a SLF4J ==
 
== Migración de Log4J a SLF4J ==
Línea 25: Línea 32:
 
# Reemplazar las referencias a Log4J en el código por las equivalentes en SLF4J.
 
# Reemplazar las referencias a Log4J en el código por las equivalentes en SLF4J.
  
==== Agregar los JAR de SLF4J ====
+
=== Agregar los JAR de SLF4J ===
 
Necesitamos al menos 2 JAR:  
 
Necesitamos al menos 2 JAR:  
 
* slf4j-api
 
* slf4j-api
Línea 52: Línea 59:
 
</code>
 
</code>
  
 +
=== Reemplazar referencias a Log4J por equivalentes en SLF4J ===
 +
Existen equivalente en SLF4J para llamadas a Log4J.
 +
 +
==== Obtención del Logger ====
 +
En [[Log4J]] el logger se obtiene:
 +
<code java5>
 +
import org.apache.log4j.Logger;
 +
...
 +
private static Logger log = Logger.getLogger(MiClase.class);
 +
</code>
 +
 +
En [[SLF4J]] el logger se obtiene:
 +
<code java5>
 +
import org.slf4j.Logger;
 +
import org.slf4j.LoggerFactory;
 +
..
 +
private static Logger log = LoggerFactory.getLogger(MiClase.class);
 +
</code>
 +
 +
==== Uso de MDC ====
 +
[[Log4J#Log4JMDC]] permite asociar información de contexto para ser usada por el framework de log. En [[Log4J]] el MDC se establece:
 +
<code java5>
 +
import org.apache.log4j.MDC;
 +
...
 +
    try {
 +
        MDC.put("unValor", valor);
 +
        //hacer algo
 +
    } finally {
 +
        MDC.remove("unValor");
 +
    }
 +
</code>
 +
 +
En [[SLF4J]] la sintaxis es igual, sólo cambia el import del MDC:
 +
<code java5>
 +
import org.slf4j.MDC;
 +
...
 +
    try {
 +
        MDC.put("unValor", valor);
 +
        //hacer algo
 +
    } finally {
 +
        MDC.remove("unValor");
 +
    }
 +
</code>
 +
 +
==== Clase Level de Log4J ====
 +
Log4J expone una clase Level (una enumeración que contiene los niveles de log) que se utiliza en el API para, programáticamente, establecer el nivel de log. Eso se realiza con el API de Log4J logger.log(Level level, Object mensaje).
  
 +
No existe un equivalente directo en SLF4J para este caso. En StackOverflow hay una interesante discusión con [http://stackoverflow.com/questions/2621701/setting-log-level-of-message-at-runtime-in-slf4j alternativas para establecer el nivel de log en tiempo de ejecución con SLF4J]. La alternativa final a usar estará determinada por la necesidad del sistema.
  
 
== Ver también ==
 
== Ver también ==
 
* [http://www.slf4j.org/ Web oficial de SLF4J]
 
* [http://www.slf4j.org/ Web oficial de SLF4J]
 
* [[Log4J]]
 
* [[Log4J]]

Revisión actual del 21:02 2 jul 2012

Simple Logging Facade for Java (SLF4J) es una librería Java que funciona como una abstracción simple para varios frameworks de logging (como Log4J, java.util.logging o Logback). Le permite al usuario final agregar el framework de log deseado al momento de deploy.

Agregar SLF4J a un proyecto implica agregar un único jar, llamado slf4j-api.jar. Si no se agrega ninguna extensión para integrar con un framework de log, SLF4J usará una implementación dummy (que no loguea).

Uso clásico

import org.slf4j.Logger; import org.slf4j.LoggerFactory;

public class MiClase {

   private static Logger logger = LoggerFactory.getLogger(MiClase.class);
   public void unMetodo() {
       log.info("Hola, mundo");
   }

}

Parametrización de mensajes

En SLF4J es muy facil parametrizar mensajes de log sin realizar concatenaciones:

logger.debug("Mensaje: {}, {}", unObjectoGrande, otroObjetoGrande);

La serialización a String de los objetos sólo se realizará si el nivel de log es el indicado, y se ubicarán en orden como reemplazo de las llaves. Este mecanismo de log es elegante y muy eficiente, porque SLF4J demora la construcción del mensaje final de log hasta que realmente sea necesario.

Migración de Log4J a SLF4J

Es relativamente sencillo quitar todas las referencias de Log4J de una aplicación para utilizar el API de SLF4J. Una vez hecho esto, la aplicación seguirá usando Log4J para loguear, pero las clases no harán referencia a este framework (y nos permitirá, a futuro, cambiar el framework de log sin realizar cambios en el código).

Los pasos para agregar SLF4J a un proyecto con Log4J son:

  1. Agregar los JAR de SLF4J.
  2. Reemplazar las referencias a Log4J en el código por las equivalentes en SLF4J.

Agregar los JAR de SLF4J

Necesitamos al menos 2 JAR:

  • slf4j-api
  • slf4j-log4j12

Además, es muy probable que algunas librerías del proyecto utilicen Jakarta Commons Logging (JCL). Para integrar también estas librerías, necesitamos agregar un JAR extra:

  • jcl-over-slf4j

Usando Maven, el POM queda:

   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
       <version>1.6.6</version>
   </dependency>
   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-log4j12</artifactId>
       <version>1.6.6</version>
   </dependency>
   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>jcl-over-slf4j</artifactId>
       <version>1.6.6</version>
   </dependency>

Reemplazar referencias a Log4J por equivalentes en SLF4J

Existen equivalente en SLF4J para llamadas a Log4J.

Obtención del Logger

En Log4J el logger se obtiene: import org.apache.log4j.Logger; ... private static Logger log = Logger.getLogger(MiClase.class);

En SLF4J el logger se obtiene: import org.slf4j.Logger; import org.slf4j.LoggerFactory; .. private static Logger log = LoggerFactory.getLogger(MiClase.class);

Uso de MDC

Log4J#Log4JMDC permite asociar información de contexto para ser usada por el framework de log. En Log4J el MDC se establece: import org.apache.log4j.MDC; ...

   try {
       MDC.put("unValor", valor);
       //hacer algo
   } finally {
       MDC.remove("unValor");
   }

En SLF4J la sintaxis es igual, sólo cambia el import del MDC: import org.slf4j.MDC; ...

   try {
       MDC.put("unValor", valor);
       //hacer algo
   } finally {
       MDC.remove("unValor");
   }

Clase Level de Log4J

Log4J expone una clase Level (una enumeración que contiene los niveles de log) que se utiliza en el API para, programáticamente, establecer el nivel de log. Eso se realiza con el API de Log4J logger.log(Level level, Object mensaje).

No existe un equivalente directo en SLF4J para este caso. En StackOverflow hay una interesante discusión con alternativas para establecer el nivel de log en tiempo de ejecución con SLF4J. La alternativa final a usar estará determinada por la necesidad del sistema.

Ver también