2013-07-25 7 views
23

Kiedy jechał przez jakiś kod, zauważyłem użycie rejestratora następująco,Czy Log4j isDebugEnabled() jest niezbędne przed użyciem funkcji logger.debug()?

if(logger.isDebugEnabled()) 
    logger.debug("Something.."); 

Ale w niektórych kodów, obserwowałem jak ten.

logger.debug("Something.."); 

Kiedy spojrzałem na źródło log4j, w sposobie Logger samego if(logger.isDebugEnabled()) sprawdzano debug(). Dlaczego potrzebujemy tego niepotrzebnego obciążenia?

Odpowiedz

37

Przydaje się, gdy przeciąganie tekstu do oceny logger.debug(...) wymaga czasu, w takim przypadku można pominąć tę ocenę, jeśli debugowanie nie jest włączone.

if(logger.isDebugEnabled()) { 
    logger.debug("The meaning of life is " + calculateMeaningOfLife()); 
} 

IMO to sprawia, że ​​kod o wiele mniej czytelny więc powinien być stosowany tylko wtedy, gdy istnieje znaczna poprawa wydajności.

4

Java musi najpierw rozwiązać parametr tekstowy przekazany do metody debugowania, zanim będzie mógł go wywołać.

logger.debug("Something.. var1=" + variable1 + " var2=" + variable2); 

Powyższy kod spowoduje wiele obiektów String tworzony jak każda + tworzy inny ciąg więc masz około 5 lub więcej obiektów utworzonych przed wywołaniem metody.

Debugowanie w większości przypadków nie zostanie włączone, więc sprawdzenie, czy włączone jest debugowanie, jest wydajniejsze niż stałe rozwiązywanie parametrów.

10

isDebugEnabled jest zwykle używany w celu uniknięcia niepotrzebnego concatination String, np niniejszego zaproszenia

logger.debug("Line number = " + n); 

najpierw wywołuje Struny concatination następnie debug(), a dopiero potem rejestrator wykryje, że debugowania nie jest włączony i po prostu wraca. Może to znacząco wpłynąć na wydajność aplikacji.

Ten problem został rozwiązany w slf4j który sformatowany metody rejestrowania jak ten

public void debug(String format, Object arg); 
2

stwierdzeniem:

if(log.isDebugEnabled()){ 

Służy tylko ze względu na wydajność. Jego użycie jest opcjonalne, ponieważ jest wewnętrznie wywoływane przez metodę dziennika.

Ale teraz pytasz, czy ta kontrola jest wewnętrznie, więc dlaczego miałbym go używać? To bardzo proste: jeśli zarejestrujesz coś tak prostego, jak to:

log.debug("ResultSet rs is retrieved from OracleTypes"); 

Wtedy nie musisz wykonywać żadnych czeków. Jeśli komponować ciąg zalogować za pomocą operatora append (+) tak:

log.debug("[" + System.getTimeInMillis() + "] ResultSet rs is retrieved from OracleTypes"); 

W tym przypadku należy sprawdzić, czy protokół jest włączony czy nie, bo jeśli nie, to nawet jeśli jest log nie, kompozycja smyczkowa jest. I muszę przypomnieć, że użycie operatora "+" do łączenia łańcuchów jest bardzo nieefektywne.

1

Implementacja SLF4J (sprawdzona w wersji 1.7.10) wzywa isDebugEnabled() w niektórych metod, takich jak:

public void debug(String format, Object... arguments) { 
    if(this.log.isDebugEnabled()) { 
     FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments); 
     this.log.debug(ft.getMessage(), ft.getThrowable()); 
    } 
} 

ale istnieje również metoda przeciążenia, które nie wewnętrznie sprawdzić, czy dany poziom zalogowaniu jest włączona, jak w:

public void debug(String msg, Throwable t) { 
    this.log.debug(msg, t); 
} 

Inną rzeczą jest to, że Logger Implementacja może zostać zmieniona, więc jeśli chcesz mieć zawsze pewność, że twój program rejestrujący jest wywoływany zgodnie z jego poziomem logowania, możesz rozważyć użycie metody isDebugEnabled().