我们已经在使用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 {} {}。