当前位置: 首页 > 知识库问答 >
问题:

Logback-如何编写自定义异常转换器以将堆栈跟踪折叠到一行中

衡丰茂
2023-03-14

我正在使用SpringBoot 2.4.8(它使用logback classic 1.2.3),我想配置一个自定义转换器,将多行堆栈跟踪折叠为一行(与这个问题相同)。

假设我有一段代码片段,出于测试目的故意抛出一个异常:

package co.foo.bar.test;

// ...

@Slf4j
public class Foo {

  public void bar() {
  // ...
    try {
      Integer.parseInt(null);
    } catch (Exception e) {
      log.error(e.getLocalizedMessage(), e);
    }
  }

}

当我定义了转换规则并将符号添加到模式中时,logback只会忽略错误日志:

logback.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <conversionRule conversionWord="ex" converterClass="co.foo.bar.logging.CompressedStackTraceConverter" />

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>
        %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %ex%n
      </pattern>
    </encoder>
  </appender>

  // ...

  <logger name="co.foo.bar.test" additivity="false" level="INFO">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="MESSAGING_LOG"/>
  </logger>

</configuration>

CompressedStackTraceConverter.java:

package co.foo.bar.logging;

// ...

public class CompressedStackTraceConverter extends ThrowableProxyConverter {
  public CompressedStackTraceConverter() {
  }

  protected String throwableProxyToString(IThrowableProxy tp) {
    String original = super.throwableProxyToString(tp);
    return original.replaceAll("\\R\\t?", " ~~ ");
  }
}

当我删除%ex符号时,logback继续打印ERROR日志,因此logback.xml应该是正确的。当我调试自定义转换器类时,我可以看到它可以在异常发生时成功返回一行异常字符串。

我很确定有一个简单的解决方案,但还不知道。我在这里错过了什么?

提前谢谢。

共有1个答案

楚嘉玉
2023-03-14

我认为可能有另一种(更新的?)方法可以实现这一点,而不是相关问题中描述的方法,或者此回退版本中存在错误。

相反,我最终使用logstash-logback编码器将所有内容打印为单行JSON字符串。

如果有人感兴趣,请举个例子:

  • pom.xml:
<dependency>
  <groupId>net.logstash.logback</groupId>
  <artifactId>logstash-logback-encoder</artifactId>
  <version>6.6</version>
</dependency>
  • logback.xml:
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
      <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
        <maxDepthPerThrowable>30</maxDepthPerThrowable>
        <maxLength>2048</maxLength>
        <rootCauseFirst>true</rootCauseFirst>
        <inlineHash>true</inlineHash>
      </throwableConverter>
      <shortenedLoggerNameLength>36</shortenedLoggerNameLength>
      <timeZone>UTC</timeZone>
    </encoder>
  </appender>
 类似资料:
  • 我使用的是JBossAS7。我已经知道如何使用自己的错误页处理HTTP错误(例如404、500、...)--这不是问题。但出于调试的原因,我需要查看错误stacktrace。如何访问默认显示的消息并将其嵌入到错误页面中?

  • 问题内容: 如何将异常的堆栈跟踪信息打印到stderr以外的流上?我发现的一种方法是使用getStackTrace()并将整个列表打印到流中。 问题答案: 可以接受or或参数: 也就是说,请考虑将SLF4J之类的记录器接口与LOGBack或log4j之类的记录实现一起使用。

  • 问题内容: 将结果转换为描述堆栈跟踪的字符串的最简单方法是什么? 问题答案: 可以使用以下方法将堆栈跟踪转换为。此类可在Apache commons-lang中找到,它是最常见的依赖库,具有许多流行的开源代码

  • 问题内容: 假设您执行 e.printStackTrace() ,则捕获到一个异常并在标准输出(例如控制台)上获得以下内容: 现在,我想将其发送给log4j之类的记录器,以获取以下信息: 我怎样才能做到这一点? 问题答案: 您将异常直接传递给记录器,例如 取决于log4j来呈现堆栈跟踪。

  • 我使用以下代码打印try-catch块中发生的任何异常,但是当异常发生时,logback不会打印完整的堆栈跟踪,而是写入一行错误(它没有明确说明是什么导致了它。我如何在logback输出中打印完整的堆栈跟踪? 尝试捕获异常的catch块 日志返回错误输出:

  • 问题内容: 更新 :Intellij IDEA的最新版本完全实现了我想要的功能。问题是如何在IDE外部实现此功能(以便我可以将异步堆栈跟踪信息转储到日志文件中),理想情况下无需使用检测代理。 自从我将应用程序从同步模型转换为异步模型以来,调试故障一直遇到问题。 当我使用同步API时,我总是在异常stacktraces中找到我的类,因此我知道从哪里开始寻找问题。使用异步API,我得到的堆栈跟踪既不引