扩展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());
}
}
是否有一种简单的方法来扩展记录器来做到这一点?
答案 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实现类似功能会涉及更多工作,最终结果也不会那么方便。