2012-08-31 11 views
6

Mam 3 programistów na projekcie, którzy mają różne style podczas zapisywania do dzienników. Która z tych odmian jest najlepsza?Składnia logowania slf4j

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

Odpowiedz

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

Prawidłowe i najlepsze.

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

Jest to najprawdopodobniej błąd. Chyba że errmsg jest wyjątkiem, nigdy nie zostanie zarejestrowane.

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

Ten nie działa tak dobrze, jak pierwszy. Będziesz uruchamiał String konkatenację za każdym razem, gdy uderzysz w tę linię, podczas gdy zastępowanie zmiennej pierwszego przypadku nastąpi tylko wtedy, gdy instrukcja zostanie faktycznie zarejestrowana.

Jakiś czas temu I blogged o różnych składniach logowania w .

+1

Chyba 2nd służy do wyjątków, prawda? na przykład LOG.info ("Błąd odczytu pliku", e); – m0therway

+0

@Pregnantmom: masz absolutną rację! "Errmsg" dał mi do zrozumienia, że ​​to nie jest wyjątek. Poprawiono moją odpowiedź. –

+0

Osobiście wolę trzeci przy użyciu konkatenacji ciągów. Jeśli chodzi o wydajność, konkatenacja ciągów może być szybsza: http://stackoverflow.com/questions/925423/is-it-better-practice-to-use-string-format-over-string-concatenation-in-java – Kirby

3

Jest to najlepszy (jcabi-log na szczycie slf4j):

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

Jest to krótki alternatywa:

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

Po pierwsze, jest to wygodne, aby pozwolić klasa jeden narzędzie dbać o rejestracja loggerów. Po drugie, bardzo wygodne jest używanie formatu String.format() do formatowania tekstu, ponieważ zawsze widzisz cały ciąg znaków i możesz go łatwo przetłumaczyć.

0

Poniżej znajduje się dokładna pasta do kopiowania z rzeczywistego javadoc slf4j. Warto odwiedzić tutaj: 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

zostanie zmieniona o pierwszej postaci jest najlepsza

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

Jak mówili inni, drugi przykład ma być błędem, ponieważ nie ma formatu żeton do wstawienia errmsg do "error = ", chyba że errmsg jest włączone rejestrowanie poziomu Throwable i info, a następnie program rejestrujący wydrukuje stracktrace.

Przez wiele lat wolałem konkatenację ciągów, trzecią formę. Zauważyłem, że łatwiej jest przeczytać miesiące lub lata później, kiedy wrócę do przeczytania kodu.

Jednak jako odpowiedź Tomasz Nurkiewicz, pierwszy formularz LOG.info("error={}", errmsg); jest najlepszy. Powodem jednak nie jest to, że String.format() jest szybszy niż konkatenacja ciągów. Nie jest. Zobacz Is it better practice to use String.format over string Concatenation in Java?.

Powodem, dla którego pierwszy formularz działa lepiej, jest to, że jeśli rejestrowanie na poziomie info jest wyłączone, struktura logowania nie musi wywoływać errmsg.toString() i nie musi w ogóle wykonywać String.format(). Jedyny przypadek, w którym errmsg.toString() nie ma żadnych kosztów wydajności, to: errmsg to String.

Ja również sugeruję brak białych znaków wokół =, ponieważ wiele agregatorów dzienników, takich jak Splunk, automatycznie indeksuje error=errmsg w parę pól i wartości.Ponadto, jeśli to naprawdę jest błąd, to zapisałbym go na poziomie error(), a nie info(). Najprawdopodobniej istnieje wyjątek Throwable gdzieś przed tym kodem, który powinien przejść do parametru Throwable.

I, logger, chociaż prawdopodobnie jest zadeklarowany jako final, jest obiektem zmiennym, więc powinien być pisany małymi literami. Zobacz Should a "static final Logger" be declared in UPPER-CASE?.

co oznacza, że ​​odpowiedź powinna być naprawdę

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

Interesujące, od napisania tej odpowiedzi, nie zgadzam się z samym sobą. aktualizowanie – Kirby

Powiązane problemy