【发布时间】: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