Log4J2:替换参数无法正常工作

时间:2018-03-25 17:07:26

标签: java logging parameters log4j2 substitution

我正在使用Log4J 2.8.2。

手册(https://logging.apache.org/log4j/2.0/manual/api.html)表示用占位符替代参数更好:

这意味着

logger.debug("Logging in user {} with birthday {}", user.getName(), user.getBirthdayCalendar());

优于

if (logger.isDebugEnabled()) {
    logger.debug("Logging in user " + user.getName() + " with birthday " + user.getBirthdayCalendar());
}

因为:

  

只会检查一次日志记录级别和字符串   只有在启用调试日志记录时才会进行构造。

所以我想说我有以下两种方法:

public static String getSentence() {
        System.out.println("Sentence Invoked!");
        return "{} im the Best!";
    }

    public static String expensiveOperation() {
        System.out.println("Expensive Invoked!");
        return "John Doe";
    }

现在,rootLogger的级别设置为INFO。如果我按以下方式记录:

LOGGER.debug(getSentence(), expensiveOperation());

我得到以下输出:

Sentence Invoked!
Expensive Invoked!

这意味着两个方法都被调用,尽管没有发生日志记录,因为LOGGER的级别为DEBUG且rootLoggers的级别为INFO

我原本预计调用getSentence()expensiveOperation()方法都不会。我做错了什么?

1 个答案:

答案 0 :(得分:0)

根据设置的日志级别过滤日志(处理程序仅接收过滤的日志)。但是jvm会执行每个日志。