2016-12-02 49 views
0

The logback parameterized logging docs says需要帮助理解的logback的参数记录优化

Object entry = new SomeObject(); 
logger.debug("The entry is {}.", entry); 

只有评估是否记录或没有,只有当 决定是肯定的,将记录器执行格式 消息并更换后{}与条目的字符串值配对。在 中,也就是说,在禁用日志语句时,此形式不会产生参数 构造的成本。

我的这种解释是entry不会在所有如果logger设置为DEBUG评估。但这怎么可能?

换句话说,如果我写的:

logger.debug("the entry is {}.", dbService.getEntry()); 

我认为如果logger没有被设置为DEBUGdbService.getEntry()不会被调用。我的理解是否正确?

回答

3

该声明意味着仅在启用日志级别时才会生成格式化消息,其中包括在entry上调用toString()的开销。 “参数构造”这个词的选择是误导性的。它仅指汇编格式化的消息。

如果你的代码执行昂贵的操作来构造传递到记录器的值,那么你将日志级别,是否已启用,每次收取费用。例如

logger.debug("The entry is {}.", entry.someVeryExpensiveOperation()); 

这是标准的Java,没有什么奇迹发生。每次都调用someVeryExpensiveOperation()