It seems that although the log level was set to INFO, SLF4J is still evaluating the expression.
package com.ab.test.slf4j;
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SimpleTest {
static final Logger logger = LoggerFactory.getLogger(SimpleTest.class);
public static void main(String[] args) {
PropertyConfigurator.configure("log4j.properties");
logger.debug("Test " + testEnter());
logger.debug("Test {}", testEnter());
}
public static String testEnter() {
System.out
.println("If you see this it means your expression is evaluated :(");
return "test";
}
}
Log4J Property file:
log4j.rootLogger=INFO, CA
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Run output:
If you see this it means your expression is evaluated :(
If you see this it means your expression is evaluated :(
EDIT: Amended the run output, as seen, the expression is evaluated, however the log message is not. Expression should not be evaluated as per SLF4J's "Performance Logging"
It's not slf4j but JVM need to compute every passed parameter before function call.
Read the given link more carefully. slf4j only skips calling toString() for Object params of skipped log statements. It's not working for skipping function calls.
But you can create custom functor object for this:
toString() method would be called only if debug is not skipped.