2012-08-31 11 views
6

Ho 3 sviluppatori in un progetto che hanno stili diversi durante la scrittura nei registri. Quale di queste varianti è la migliore?sintassi di registrazione slf4j

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

risposta

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

corretto e migliore.

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

Questo è molto probabilmente sbagliato. A meno che l'errmsg sia un'eccezione, non verrà mai registrata.

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

Questo non funziona come prima. Esegui la concatenazione String ogni volta che si preme questa linea mentre nel primo caso la sostituzione della variabile avviene solo se l'istruzione verrà effettivamente registrata.

Qualche tempo fa I blogged su diverse sintassi di registrazione in .

+1

Credo che il secondo è usato per le eccezioni, giusto? per esempio. LOG.info ("Errore durante la lettura del file", e); – m0therway

+0

@Pregnantmom: hai assolutamente ragione! L'errmsg mi ha fatto credere che questa non sia un'eccezione. Corretta la mia risposta –

+0

Personalmente preferisco il terzo utilizzo della concatenazione di stringhe. Per quanto riguarda le prestazioni, la concatenazione delle stringhe può essere più veloce: http://stackoverflow.com/questions/925423/is-it-better-practice-to-use-string-format-over-string-concatenation-in-java – Kirby

3

Questo è il miglior (jcabi-log in cima SLF4J):

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

E 'un breve un'alternativa a:

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

In primo luogo, è conveniente lasciare che una classe di utilità per prendersi cura di istanza di logger. In secondo luogo, è molto conveniente usare String.format() per la formattazione del testo, perché si vede sempre l'intera stringa e può facilmente tradurla.

0

Di seguito è riportato l'incolla di copia esatta dall'effettivo slf4j javadoc. Vale la pena visitare qui: 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

Un'alterazione della prima forma è la migliore

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

Come altri hanno già detto, il secondo esempio deve essere un errore in quanto non v'è alcun segno formato da inserire errmsg in "error = ", a meno che errmsg sia un Throwable e info la registrazione del livello sia abilitata, quindi il registratore stamperà un stracktrace.

Per molti anni ho preferito la concatenazione di stringhe, la terza forma. Ho trovato più facile leggere mesi o anni dopo quando torno a leggere il codice.

Tuttavia, come risposta Tomasz Nurkiewicz, il primo modulo LOG.info("error={}", errmsg); è il migliore. Il motivo, tuttavia, non è che String.format() è più veloce della concatenazione di stringhe. Non lo è. Vedi Is it better practice to use String.format over string Concatenation in Java?.

La ragione per la prima forma si comporta meglio è che se la registrazione info livello è disattivata, allora il quadro di registrazione non deve chiamare errmsg.toString() e non deve eseguire String.format() a tutti. L'unico caso in cui lo errmsg.toString() non ha costi di performance è se errmsg è un String.

Inoltre suggerisco di non inserire spazi bianchi attorno allo = poiché molti aggregatori di registri come Splunk indicizzeranno automaticamente error=errmsg in una coppia di campi e valori.Inoltre, se questo è veramente un errore, allora lo scriverei al livello error(), non info(). E molto probabilmente c'è un'eccezione Throwable da qualche parte prima di questo codice che dovrebbe andare nel parametro Throwable.

E, logger, mentre è probabilmente dichiarato come final, è un oggetto mutabile, quindi, dovrebbe essere in minuscolo. Vedi Should a "static final Logger" be declared in UPPER-CASE?.

che significa che la risposta dovrebbe davvero essere

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

Interessante, da quando ho scritto questa risposta, ora non sono d'accordo con me stesso. in aggiornamento – Kirby

Problemi correlati