我正在使用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()
方法都不会。我做错了什么?
答案 0 :(得分:0)
根据设置的日志级别过滤日志(处理程序仅接收过滤的日志)。但是jvm会执行每个日志。