Logback - 如何编写自定义异常转换器以将堆栈跟踪折叠成一行
Posted
技术标签:
【中文标题】Logback - 如何编写自定义异常转换器以将堆栈跟踪折叠成一行【英文标题】:Logback - How to write custom exception converter to collapse stack trace into one line 【发布时间】: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>
%dyyyy-MM-dd HH:mm:ss [%thread] %-5level %logger36 - %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】:我认为除了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>
【讨论】:
以上是关于Logback - 如何编写自定义异常转换器以将堆栈跟踪折叠成一行的主要内容,如果未能解决你的问题,请参考以下文章