2012-08-31 4 views
6

Ich habe 3 Entwickler für ein Projekt, die verschiedene Stile beim Schreiben in Protokolle haben. Welche dieser Variationen ist am besten?Slf4j Logging-Syntax

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

Antwort

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

Richtige und am besten.

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

Dies ist höchstwahrscheinlich falsch. Wenn errmsg eine Ausnahme ist, wird sie niemals protokolliert.

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

Dieser leistet nicht so gut wie der erste. Sie werden String Verkettung jedes Mal ausführen, wenn Sie diese Zeile treffen, während im ersten Fall Variable Ersetzung nur auftritt, wenn Anweisung tatsächlich protokolliert wird.

Vor einiger Zeit I blogged über verschiedene Protokollierungssyntaxen in .

+1

Ich denke, die zweite für Ausnahmen verwendet wird, nicht wahr? z.B. LOG.info ("Fehler beim Lesen der Datei", e); – m0therway

+0

@Pregnantmom: du hast absolut recht! Die "Errmsg" hat mich glauben gemacht, dass dies keine Ausnahme ist. Korrigierte meine Antwort. –

+0

Persönlich bevorzuge ich die dritte Verwendung String-Verkettung. Was die Leistung betrifft, kann die String-Verkettung schneller sein: http://stackoverflow.com/questions/925423/is-it-better-practice-to-use-string-format-over-string-concatenation-in-java – Kirby

3

Dies ist die beste (jcabi-log oben auf SLF4J):

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

Es ist eine kurze Alternative zu:

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

Erstens ist es praktisch, eine Utility-Klasse zu lassen darauf achten, um Logger Instanziierung. Zweitens ist es sehr praktisch, String.format() für die Textformatierung zu verwenden, weil Sie immer die ganze Zeichenfolge sehen und leicht übersetzen können.

0

Unten ist die genaue Kopie Paste von tatsächlichen Slf4j Javadoc. Es lohnt sich den Besuch hier: 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

Eine Veränderung der ersten Form ist die beste

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

Wie andere gesagt haben, das zweite Beispiel ein Fehler sein muss, da es kein Format-Token einfügen errmsg in "error = ", wenn errmsg ist eine Throwable und info Level-Protokollierung aktiviert ist, dann wird der Logger eine Stracktrace drucken.

Seit vielen Jahren bevorzugte ich die String-Verkettung, die dritte Form. Ich fand es leichter, Monate oder Jahre später zu lesen, wenn ich zurückgehe, um den Code zu lesen.

Wie jedoch Tomasz Nurkiewicz beantwortet, ist die erste Form LOG.info("error={}", errmsg); die beste. Der Grund ist jedoch nicht, dass String.format() schneller ist als String-Verkettung. Es ist nicht. Siehe Is it better practice to use String.format over string Concatenation in Java?.

Der Grund für die erste Form ist, dass die Protokollierung deaktiviert ist, dann wird der Logging-Framework aufrufen muss nicht errmsg.toString() wenn der info Ebene besser abschneidet und es muss nicht String.format() überhaupt auszuführen. Der einzige Fall, in dem errmsg.toString() keine Leistungskosten hat, ist, wenn errmsg ein String ist.

Ich würde auch keine Whitespace um die = vorschlagen, da viele Log-Aggregatoren wie Splunk automatisch error=errmsg in ein Feld und ein Wertpaar indexieren.Auch wenn dies wirklich ein Fehler ist, dann würde ich es auf die error() Ebene schreiben, nicht info(). Und höchstwahrscheinlich gibt es irgendwo vor diesem Code eine Throwable Ausnahme, die in den Throwable Parameter gehen sollte.

Und logger, während es wahrscheinlich als final deklariert ist, ist ein veränderbares Objekt, so sollte es in Kleinbuchstaben sein. Siehe Should a "static final Logger" be declared in UPPER-CASE?.

wodurch die Antwort wirklich

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

Interessant, Seit ich diese Antwort geschrieben habe, stimme ich jetzt nicht mit mir überein. Aktualisierung – Kirby