记录语法详细信息

时间:2014-11-12 13:44:22

标签: java logging syntax

我有一个关于日志记录的简单问题 为什么通常使用此语法进行日志记录:

LOG.debug("invalidate {}",_clusterId);

不是这个:

LOG.debug("invalidate" + _clusterId);

2 个答案:

答案 0 :(得分:0)

当您拥有包含多个参数的语句时,将模式编写为字符串后跟参数会使代码更具可读性。它也可能更高效,避免不必要地创建许多临时字符串对象,但这取决于日志框架如何在内部实现插值。

要查看第一个点,请将其与使用字符串连接的等效行进行比较。

LOG.debug("{}: Error {} while processing {} at stage {}", currentFile, 
        exception.getMessage(), operation.getName(), operation.getStage())

当只有一个参数时,除了与一般情况一致外,使用哪个参数并不重要。

答案 1 :(得分:0)

在您的示例中,假设您将日志记录级别设置为INFO。您想完全忽略调试级别的消息。但是,在获取参数之后,log方法在输入方法之前无法检查日志级别。因此,如果您不知道是否需要参数,最好避免对其进行评估。

使用第二个示例,即使将logging设置为info,_clusterId也会调用toString,然后将生成的字符串与前面的字符串连接起来。然后,一旦进入该方法,记录器就会发现调试级别不需要记录,它会抛弃新创建的字符串并退出该方法。

对于第一个示例,如果未启用调试级别日志记录,则_clusterId不会在其上调用toString,并且不会构建日志消息。调用toString可能很慢或者创建垃圾,最好避免在没有任何内容记录的情况下使用它。

这是log4j的org.apache.log4j.Category(它是Logger的超类)上的调试方法的源代码:

public void debug(Object message, Throwable t) {
  if(repository.isDisabled(Level.DEBUG_INT))
    return;

  if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel()))
    forcedLog(FQCN, Level.DEBUG, message, t);
}