The logback parameterized logging docs says:
Object entry = new SomeObject(); logger.debug("The entry is {}.", entry);
只有在评估是否记录之后,才会进行记录 决定是积极的,将记录器实现格式化 消息并用条目的字符串值替换
{}
对。在 换句话说,这种形式不会产生参数成本 禁用日志语句时的构造。
我对此的解释是,如果记录器设置为entry
,则DEBUG
根本不会被评估。但那怎么可能呢?
换句话说,如果我写了:
logger.debug("the entry is {}.", dbService.getEntry());
如果记录器未设置为dbService.getEntry()
,我认为不会调用DEBUG
。我的理解是否正确?
答案 0 :(得分:3)
该语句意味着只有在启用日志级别时才会构建格式化消息,包括在toString()
上调用entry
的费用。 “参数构造”这个词的选择具有误导性。它仅指汇编格式化的消息。
如果您的代码执行昂贵的操作来构造传递给记录器的值,则无论是否启用日志级别,您每次都会产生费用。例如
logger.debug("The entry is {}.", entry.someVeryExpensiveOperation());
这是标准的Java,没有什么魔法发生。每次都会调用someVeryExpensiveOperation()
。