Search code examples
javalogginglogback

Should we use isDebugEnabled() while logging calculated data with Logback?


Although in some tutorials, for example here (Parametrized logging section), said that Logback message {} parametrization help us to avoid unnecessary calculation in logging data (if logging level is not DEBUG):

logger.debug("The bonus for employee {} is {}", 
   employee.getName(), employeeService.calculateBonus(employee));

I tested (on logback version 1.2.3) that this optimization works only for unnecessary toString() of parameter object - as this works for log4j.

Logback documentation doesn't cover this detail.

So, we have to use isDebugEnabled() for all 'expensive' logging, do we?


Solution

  • Take a look at the example here

    Since 2.4, methods have been added to the Logger interface to support lambda expressions. The new methods allow client code to lazily log messages without explicitly checking if the requested log level is enabled. For example, previously one would write:

    // pre-Java 8 style optimization: explicitly check the log level
    // to make sure the expensiveOperation() method is only called if necessary
     if (logger.isTraceEnabled()) {
         logger.trace("Some long-running operation returned {}", expensiveOperation());
     }
    

    With Java 8, the same effect can be achieved with a lambda expression:

    // Java-8 style optimization: no need to explicitly check the log level:
    // the lambda expression is not evaluated if the TRACE level is not enabled
    logger.trace("Some long-running operation returned {}", () -> expensiveOperation());