Logback使用ex{depth}限制栈追踪时如何省略重复栈帧?
问题:Logback限制栈追踪行数时如何保留重复栈帧省略功能?
我正在调试Logback的日志格式,想要创建仅打印栈追踪前3行的格式。默认情况下Logback会自动省略重复栈帧,但使用%ex{depth}模式限制栈追踪行数时,该省略功能失效了,且未找到对应配置项。使用的Logback版本为1.2.11。
示例代码与配置
Java测试类
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestLog { private static final Logger LOGGER = LoggerFactory.getLogger(TestLog.class); public static void main(String[] args) { try { ex1(); } catch (Exception e) { LOGGER.debug("foobar", e); } } static void ex1() { ex2(); } static void ex2() { ex3(); } static void ex3() { ex4(); } static void ex4() { throw new IllegalStateException("ex in 4", new IllegalArgumentException("cause of ex in 4")); } }
Logback配置文件
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!-- 限制每个异常栈追踪为3行,但不会省略重复帧的配置 --> <!-- <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%15.15thread] %-20.20logger{19} : %m %ex{3}%nopex%n</Pattern>--> <!-- 默认配置,会省略重复帧 --> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%15.15thread] %-20.20logger{19} : %m%n</Pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration>
输出对比
默认配置下的输出
2022-07-29 10:38:08.184 DEBUG [ main] TestLog : foobar java.lang.IllegalStateException: ex in 4 at TestLog.ex4(TestLog.java:29) at TestLog.ex3(TestLog.java:25) at TestLog.ex2(TestLog.java:21) at TestLog.ex1(TestLog.java:17) at TestLog.main(TestLog.java:10) Caused by: java.lang.IllegalArgumentException: cause of ex in 4 ... 5 common frames omitted
启用行数限制后的输出
2022-07-29 10:37:45.002 DEBUG [ main] TestLog : foobar java.lang.IllegalStateException: ex in 4 at TestLog.ex4(TestLog.java:29) at TestLog.ex3(TestLog.java:25) at TestLog.ex2(TestLog.java:21) Caused by: java.lang.IllegalArgumentException: cause of ex in 4 at TestLog.ex4(TestLog.java:29) at TestLog.ex3(TestLog.java:25) at TestLog.ex2(TestLog.java:21)
提问
如何在使用%ex{depth}模式限制栈追踪行数的同时,保留Logback默认的重复栈帧省略功能?
内容的提问来源于stack exchange,提问作者TomStroemer
相关产品推荐
相关产品推荐

