2013-07-25 19 views
23

Quando stavo attraversando un codice, ho notato l'uso del registratore come segue,È necessario Log4j isDebugEnabled() prima di utilizzare logger.debug()?

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

Ma in alcuni codici, ho osservato come questo.

logger.debug("Something.."); 

quando ho guardato la fonte di log4j, nel metodo di Logger per sé if(logger.isDebugEnabled()) stato controllato debug(). Allora perché abbiamo bisogno di questo inutile sovraccarico if(logger.isDebugEnabled()) ??

risposta

37

È utile quando la stringa passata a logger.debug(...) richiede tempo per essere valutata, in tal caso è possibile saltare questa valutazione se il debug non è abilitato.

IMO rende il codice molto meno leggibile, quindi deve essere utilizzato solo quando c'è un miglioramento significativo delle prestazioni.

4

Java deve prima risolvere il parametro stringa passato al metodo di debug prima che possa chiamarlo.

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

Il codice di cui sopra si tradurrà in più oggetti String essere creati come ogni + crea un'altra stringa in modo da avere circa 5 o più oggetti creati prima di chiamare il metodo.

Il debug non è abilitato per la maggior parte, quindi è più efficiente controllare se il debug è abilitato piuttosto che risolvere i parametri in ogni momento.

10

isDebugEnabled viene utilizzato in genere per evitare inutili concatination String, ad esempio, questa chiamata

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

primo invoca Strings concatination poi debug() e solo allora Logger rileva che il debug non è abilitato e restituisce semplicemente. Ciò potrebbe influire in modo significativo sulle prestazioni dell'app.

Questo problema è risolto in SLF4J che ha formattato metodi di registrazione come questo

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

La dichiarazione:

if(log.isDebugEnabled()){ 

Viene utilizzato solo per motivi di prestazioni. Il suo uso è facoltativo poiché viene chiamato internamente dal metodo log.

Ma ora chiedi se questo controllo è fatto internamente, quindi perché dovrei usarlo? E 'molto semplice: se si accede qualcosa di semplice come questo:

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

Allora non c'è bisogno di fare alcun controllo. Se si compone uno stringa di effettuare il login utilizzando l'operatore append (+) in questo modo:

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

In questo caso si dovrebbe verificare se il registro è abilitata o meno, perché se non lo è, anche se il registro è non fatto, la composizione dello spago è. E devo ricordarti che l'uso dell'operatore "+" per concatenare le stringhe è molto inefficiente.

1

Implementazione SLF4J (verificata sulla versione 1.7.10) chiede isDebugEnabled() in alcuni metodi come:

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

ma ci sono anche sovraccarichi metodi che non verifica internamente sia dato livello loggin è attivata, come in:

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

Un'altra cosa è che Logger l'implementazione può essere modificata, quindi se vuoi essere sempre sicuro che il tuo logger sia chiamato in base al suo livello di registrazione, allora potresti prendere in considerazione l'utilizzo del metodo isDebugEnabled().

Problemi correlati