是否有支持智能参数扩展的java库,String.format等

时间:2011-09-29 19:32:23

标签: java logging

这就是我要找的东西:

  • 爪哇
  • 可以替换commons logging或slf4j的日志库
  • 仅当日志级别需要时才进行参数扩展(即没有if (log.isDebugEnabled())块)
  • 字符串格式与java.lang.String.format
  • 相同
  • 将java.lang.Throwable检测为最终参数并记录堆栈跟踪

目标是编写像这样的代码

private static final Log log = new Log.getLog(MyClass.class);
// ...
String value = "test";
log.debug("The value is [%s]", value); // [1]
// ...
} catch (Exception e) {
    log.error("Caught Exception: %s", e.getMessage(), e); // [2]
}

[1]会打印一个像

这样的日志语句
The value is [test]

如果日志级别为INFO,则不会发生字符串格式化操作。

[2]会打印

Caught Exception: [value of e.getMessage()]
java.lang.Exception
  at com.my.org.MyClass.myMethod(MyClass.[line number])
  at [...]

这对我来说似乎是非常理智的行为。我很惊讶我找不到这样做的图书馆。

编辑:我应该指定,但是slf4j不符合所有这些要求。

2 个答案:

答案 0 :(得分:7)

  

爪哇

带有Logback绑定的SLF4J。

  

可以替换commons logging或slf4j的日志库

唯一成熟的替代方案是Log4J和java.util.logging ......

  

仅当日志级别需要时才进行参数扩展(即如果(log.isDebugEnabled())阻止则为no

在SLF4J中输入:

log.debug("Names are: {}", namesCollection);

然后,只有在toString()返回true(无需明确提供)时才会执行昂贵的isDebugEnabled()

  

字符串格式与java.lang.String.format

相同

您真的需要在日志文件中使用花哨的格式(小数,货币,区域设置)吗?或{}懒惰扩展(见上文)?

  

将java.lang.Throwable检测为最终参数和日志堆栈跟踪

SLF4J以这种方式工作since 1.6

答案 1 :(得分:2)

JBoss有一个logging implementation,它执行printf和MessageFormat样式的格式化。据说它可以单独使用,但我找不到它的项目,除了它与Seam Solder的集成。但是有一些独立的工件:https://repository.jboss.org/nexus/content/groups/public/org/jboss/logging/jboss-logging/