Logger slf4j使用{}而不是字符串连接格式化的优点

时间:2012-05-11 16:43:10

标签: optimization logging concatenation string-formatting slf4j

使用{}代替字符串连接有什么好处吗?

来自slf4j的一个例子

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

而不是

logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);

我认为这是关于速度优化的,因为根据配置文件,可以在运行时避免参数评估(和字符串连接)。但是只有两个参数是可能的,那么有时除了字符串连接之外别无选择。需要就此问题提出意见。

4 个答案:

答案 0 :(得分:58)

关于字符串连接性能。如果你有密集的日志记录,这可能很重要。

  

(在SLF4J 1.7之前)但只有两个参数可能

由于绝大多数日志记录语句都有2个或更少的参数,因此最高版本1.6的SLF4J API涵盖(仅)大多数用例。自API版本1.7以来,API设计人员已经为重载方法提供了varargs参数。

对于那些需要2个以上并且你坚持使用1.7之前的SLF4J的情况,那么只需使用字符串连接或new Object[] { param1, param2, param3, ... }。它们应该足够少,表现不那么重要。

答案 1 :(得分:36)

简短版:是的,速度更快,代码更少!

字符串连接在不知道是否需要的情况下完成了大量工作(传统的“正在调试已启用”测试从log4j中得知),并且应该尽可能避免,因为{}允许延迟toString()调用和字符串构造之后,确定事件是否需要捕获。通过使记录器格式为单个字符串,我认为代码变得更清晰。

您可以提供任意数量的参数。请注意,如果您使用旧版本的sljf4j并且{}有两个以上的参数,则必须使用new Object[]{a,b,c,d}语法来传递数组。参见例如http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(java.lang.String, java.lang.Object[])

关于速度:Ceki在其中一个名单上发布了一段基准。

答案 2 :(得分:6)

因为String中的String是不可变的,所以左右String必须被复制到每个串联的新String中。所以,最好选择占位符。

答案 3 :(得分:3)

另一种选择是String.format()。我们在jcabi-log(slf4j周围的静态实用程序包装器)中使用它。

Logger.debug(this, "some variable = %s", value);

它更易于维护和扩展。此外,它很容易翻译。