【问题标题】:Logback - How to write custom exception converter to collapse stack trace into one lineLogback - 如何编写自定义异常转换器以将堆栈跟踪折叠成一行
【发布时间】:2021-10-09 09:21:34
【问题描述】:

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

假设我有这段代码 sn-p 故意抛出一个异常用于测试目的:

package co.foo.bar.test;

// ...

@Slf4j
public class Foo {

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

}

当我定义了conversionRule 并将%ex 符号添加到模式中时,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 应该是正确的。而且我在调试自定义转换器类的时候,可以看到只要发生异常,它都能成功返回一行异常字符串。

我很确定有一个简单的解决方案,但还无法弄清楚。我在这里错过了什么?

提前致谢。

【问题讨论】:

    标签: java spring-boot logging logback slf4j


    【解决方案1】:

    我认为除了the related question 中描述的方法之外,可能还有另一种(更新的?)方法可以实现此目的,或者此 logback 版本中存在错误。

    相反,我最终使用 logstash-logback-encoder 将所有内容打印为单行 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>
    

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 2015-12-26
      • 2011-01-05
      • 2015-01-03
      • 1970-01-01
      • 2010-11-23
      • 2017-08-06
      • 2010-09-13
      相关资源
      最近更新 更多