3

扩展 logger.warn 方法功能的最简单方法是什么?

考虑代码:

logger.warn("Invalid value ({}). Defaulting to UNKNOWN.", value);

我还想打印堆栈跟踪 - 或者每次遇到警告时都做一些特别的事情。例如:

logger.warn("Invalid value ({}). Defaulting to UNKNOWN.", value);
for (StackTraceElement stackTraceElement:Thread.currentThread().getStackTrace()) {
  logger.warn(stackTraceElement.toString());
}

我希望能够将“for循环”放在记录器方法中。就像是。

public void warn (String s, Object o) {
  super(s, o);
  for (StackTraceElement stackTraceElement:Thread.currentThread().getStackTrace()) {
    logger.warn(stackTraceElement.toString());
  }
}

有没有一种简单的方法来扩展记录器来做到这一点?

4

1 回答 1

0

Markers是 SLF4J API 的一部分,这是要走的路。不幸的是,只有原生实现 SLF4J API 的 logback 框架支持标记。此外,指定的 logback 的 %caller 转换已经支持您描述的开箱即用的用例。

您可以将 %caller转换词添加到您的模式中。例如, "%d %t %logger - %m%n%caller{2, WITH_CALLER_MARKER}" 其中 WITH_CALLER_MARKER 表示评估者。在此配置中,如果 WITH_CALLER_MARKER 评估器返回 true,则将打印 3 行调用者数据。

评估器将在 logback.xml 配置文件中指定如下。

<evaluator name="WITH_CALLER_MARKER" 
           class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
  <marker>WITH_CALLER</marker>
</evaluator>

启用呼叫者信息现在就像使用“WITH_CALLER”标记记录一样简单。这是一个例子,

Marker withCallerMaker = MarkerFactory.getMarker("WITH_CALLER");
Logger logger = LoggerFactory.getLogger("some.name");
logger.warn(withCallerMarker, "Invalid value {}. Defaulting to UNKNOWN.", value);

由于您已经在使用 SLF4J,因此迁移到 logback 非常容易。只需将您的 log4j.properties 文件转换为 logback.xml,删除 slf4j-log4j12.jar,并将 log4j.jar 替换为 logback-*.jar 即可。甚至还有一个工具可以将log4j.properties 文件转换为 logback.xml。

恐怕用 log4j 实现类似的功能会涉及更多的工作,最终结果也不会那么方便。

于 2012-05-26T22:09:44.880 回答