覆盖slf4j中的日志记录方法(logger.warn)

时间:2012-05-26 12:55:25

标签: log4j override extend slf4j

扩展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());
  }
}

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

1 个答案:

答案 0 :(得分:0)

Markers,它是SLF4J API的一部分。不幸的是,只有原生实现SLF4J API的logback框架才支持标记。此外,指定的logback的%调用者转换已经支持您开箱即用的用例。

您可以将%调用者conversion word添加到您的模式中。例如,“%d%t%logger - %m%n%caller {2,WITH_CALLER_MARKER}”,其中WITH_CALLER_MARKER表示evaluator。在此配置中,如果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即可完成。 logback.xml甚至还有一个tool to translate log4j.properties文件。

我担心使用log4j实现类似功能会涉及更多工作,最终结果也不会那么方便。