sl4j用log4j,懒惰的评价

时间:2016-12-19 07:22:13

标签: java logging log4j slf4j lazy-evaluation

我们已经在使用lo4j,但因为它是一个死项目而且sl4j是其他日志框架的一个很好的外观选项,我们想切换到sl4j和log4j。 我们还计划使用sl4j + androidlog4j。无论如何,我们当前的应用程序使用以下方式调用记录器类:(存在数百个这样的调用)

// 5 parameters, 2 of them variable
CustomLogger.log("calculated result is ", nResult, " took ", nDuration, " sec");

// 2 parameters, one is variable
CustomLogger.log("the error code is ", nErrorCode, " after operation");

// 6 parameters, 3 variable
CustomLogger.log("the user path for file ", strFile, " generated under folder ", strFolder, " with the reuslt code ", nCode);

如你所见,我们总是生成一个对象数组,在向log4j发送调用之前,我们只生成一个字符串(通过在数组的for循环[]中生成一个stringbuilder,即使禁用了logger也存在巨大的性能问题,没有懒惰的评价)例如:

class CustomLogger {
     public static log(Object ...arry) {
         StringBuilder sb = new StringBuilder();
         for (Object o : arry) {
              sb.append(o);
         }
         log4JLogger.log(sb.toString());

现在我们必须将调用绑定到单个sl4j调用,但我们必须转换为{}表示法。我们是否必须手动更改每个日志调用?例如:

CustomLogger.log("calculated result is ", nResult, " took ", nDuration, " sec");

应转换为:

SL4JLogger.log("calculated result {} took {} sec", nResult, nDuration);

您建议使用更简单的解决方案,而不是在没有性能损失的情况下更改所有基础呼叫吗?我们使用最新版本的sl4j,log4j。以下调用部分解决了问题,如果将变量参数count限制为5,但如果参数计数小于5,我们在输出中始终保持{}:

// suppose we will have 5 variable args at maximum
SL4jLogger.log("{} {} {} {} {}", arry);

但是当我们调用3个变量时,输出中会有额外的2 {} {}。

0 个答案:

没有答案