java - Logback - 如何编写自定义异常转换器以将堆栈跟踪折叠成一行
问题描述
我正在使用 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);
}
}
}
当我定义了符号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 应该是正确的。而且当我调试自定义转换器类时,我可以看到它可以在发生异常时成功返回一行异常字符串。
我很确定有一个简单的解决方案,但还不能弄清楚。我在这里想念什么?
提前致谢。
解决方案
我认为可能有另一种(更新的?)方法来实现这一点,而不是相关问题中描述的方法,或者此 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>
推荐阅读
- javascript - users.get(principalID) 的 azure-graph 权限
- node.js - MongoDB bulk.execute() 承诺既不解决也不拒绝,并且不返回 bulkWriteResult
- tensorflow - 如何将 Dlib 权重转换为 tflite 格式?
- r - 在 gsub 函数中定义的参数之前将给定字符替换为新字符
- css - 使用文本缩放 div 内的图像
- python-2.7 - 使用 dejavu(python 脚本)麦克风歌曲识别与从智能手机(phonegap)到服务器的音频数据流
- c# - 必须使用 await/async 在与 DependencyObject 相同的线程上创建 DependencySource
- oracle-apex - 如果用户尝试保存已经存在于我的基于 Oracle Apex 表单的应用程序的表的值,如何显示警报
- aws-lambda - Amazon LEX Facebook 集成:访问用户资料和位置数据?
- testing - WebStorm、Meteor 和电话测试