2012-08-31 14 views
6

Tengo 3 desarrolladores en un proyecto que tienen estilos diferentes al escribir en los registros. ¿Cuál de estas variaciones es la mejor?slf4j logging sintaxis

LOG.info("error = {}", errmsg); 
LOG.info("error = ", errmsg); 
LOG.info("error = " + errmsg); 

Respuesta

8
LOG.info("error = {}", errmsg); 

correcta y mejor.

LOG.info("error = ", errmsg); 

Probablemente sea incorrecto. A menos que errmsg sea una excepción, nunca se registrará.

LOG.info("error = " + errmsg); 

Esta no funciona tan bien como la primera. Ejecutará la concatenación String cada vez que pulse esta línea, mientras que en el primer caso la sustitución de la variable solo se producirá si la declaración se registra realmente.

Hace un tiempo I blogged sobre diferentes sintaxis de registro en .

+1

supongo que la segunda se utiliza para excepciones, ¿verdad? p.ej. LOG.info ("Error al leer el archivo", e); – m0therway

+0

@Pregnantmom: ¡tienes toda la razón! El 'errmsg' me hizo creer que esto no es una excepción. Corregí mi respuesta. –

+0

Personalmente prefiero la tercera concatenación de cadenas. En cuanto al rendimiento, la concatenación de cadenas puede ser más rápida: http://stackoverflow.com/questions/925423/is-it-better-practice-to-use-string-format-over-string-concatenation-in-java – Kirby

3

Ésta es la mejor (jcabi-log en la parte superior de SLF4J):

Logger.info(this, "error=%s", errmsg); 

Es un corto alternativa a:

private static Logger LOG = Logger.getLogger(Foo.class); 
LOG.info(String.format("error=%s", errmsg)); 

En primer lugar, es conveniente dejar una clase de utilidad para tener cuidado acerca de instanciación de registradores. En segundo lugar, es muy conveniente utilizar String.format() para el formateo de texto, porque siempre se ve toda la cadena y se puede traducir fácilmente.

0

A continuación se muestra la copia exacta pegar de slf4j javadoc real. Vale la pena visitar aquí: http://www.slf4j.org/api/org/slf4j/Logger.html

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

public class Wombat { 

    final static Logger logger = LoggerFactory.getLogger(Wombat.class); 
    Integer t; 
    Integer oldT; 

    public void setTemperature(Integer temperature) { 
    oldT = t; 
    t = temperature; 
    logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT); 
    if(temperature.intValue() > 50) { 
     logger.info("Temperature has risen above 50 degrees."); 
    } 
    } 
} 
1

Una alteración de la primera forma es la mejor

log.info("error={}", errmsg); 

Como otros han dicho, el segundo ejemplo tiene que ser un error, ya que no hay un token de formato para insertar errmsg en "error = ", a menos que errmsg esté Throwable y info, el registro de nivel está habilitado, y luego el registrador imprimirá una traza suave.

Durante muchos años he preferido la concatenación de cadenas, la tercera forma. Me resulta más fácil leer meses o años más tarde cuando vuelvo a leer el código.

Sin embargo, como Tomasz Nurkiewicz responde, la primera forma LOG.info("error={}", errmsg); es la mejor. La razón, sin embargo, no es que String.format() sea más rápido que la concatenación de cadenas. No lo es Ver Is it better practice to use String.format over string Concatenation in Java?.

La razón por la primera forma se comporta mejor es que si el registro info nivel está desactivado, entonces el marco de registro no tiene que llamar errmsg.toString() y que no tiene que ejecutar String.format() en absoluto. El único caso en el que errmsg.toString() no tiene costo de rendimiento es si errmsg es String.

También sugeriría que no haya espacios en blanco alrededor del =, ya que muchos agregadores de registros como Splunk indexarán automáticamente error=errmsg en un par de campos y valores.Además, si esto realmente es un error, entonces lo escribiría en el nivel error(), no en info(). Y lo más probable es que haya una excepción Throwable en algún lugar antes de este código que debe entrar en el parámetro Throwable.

Y, logger, aunque probablemente se declare como final, es un objeto mutable, por lo que debe estar en minúscula. Ver Should a "static final Logger" be declared in UPPER-CASE?.

lo que significa que la respuesta debería ser

log.info("error={}", errMsg, exception); 
+0

Interesante, desde que escribí esta respuesta, ahora estoy en desacuerdo conmigo mismo. actualización – Kirby