【问题标题】:Overriding the logging methods (logger.warn) in slf4j覆盖 slf4j 中的日志记录方法 (logger.warn)
【发布时间】:2012-06-01 17:51:44
【问题描述】:

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

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

【问题讨论】:

  • 您考虑过logger.warn("...{}", value, new RuntimeException("for log")) 变体吗?

标签: log4j overriding extend slf4j


【解决方案1】:

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

您可以将 %caller 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 translatelog4j.properties 文件。

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

【讨论】:

  • 首先,感谢您的建议。问:如果我更改为 logback 框架,然后实现特定于该框架的代码,那么我想我不需要 SLF4J 来允许我切换日志框架?
  • 在上面的例子中,你只是在配置 logback。没有涉及 自定义Java 代码。更重要的是,您的代码仍将依赖于slf4j API 而不是 logback。即使您必须编写自定义附加程序或转换说明符(在这种情况下您不必这样做),只要您的代码仅使用 SLF4J API,您对 logback 的依赖实际上将为零。假设您当前正在使用 log4j,那么您对 ​​log4j.properties 的依赖最小且不可压缩。通过迁移到 logback,您将对 logback.xml 产生最小且不可压缩的依赖。
猜你喜欢
  • 2012-08-26
  • 2022-01-13
  • 2014-03-17
  • 2012-01-12
  • 2011-11-07
  • 2022-01-27
  • 2016-04-08
  • 2021-06-06
  • 2021-05-17
相关资源
最近更新 更多