在SpringBoot中使用logback优化异常堆栈的输出
一、背景
在我们在编写程序的过程中,无法保证自己的代码不抛出异常。当我们抛出异常的时候,通常会将整个异常堆栈的信息使用日志记录下来。通常一整个异常堆栈的信息是比较多的,而且存在一些没用的信息。那么我们如何优化一些异常堆栈的信息打印,过滤掉不必要的信息呢?
二、需求
1、现有的异常堆栈信息
文章图片
2、我们想优化成如下
文章图片
三、使用的技术
1、此处我们是在SpringBoot
中使用logback
来实现日志的打印。
2、默认情况下,重写异常堆栈的打印比较复杂,此处我们采用第三方实现 ogstash-logback-encoder
来实现。
文章图片
3、那么此处我们就采用 ogstash-logback-encoder
的 ShortenedThrowableConverter
来实现。这个可以在以json格式的日志输出中使用
,也可以使用到非json格式的日志中使用
。我们将会用在以非json格式日志的输出。
四、技术实现
1、引入依赖
org.springframework.boot
spring-boot-starter-web
net.logstash.logback
logstash-logback-encoder
7.1.1
注意:
使用
logstash-logback-encoder
有一些依赖项,我当前使用的依赖项如下:1、如果发生了异常
文章图片
2、jdk的版本依赖
文章图片
版本不同,可能依赖的版本也不一样,推荐查看官方网址:https://github.com/logfellow/logstash-logback-encoder#java-version-requirements
2、代码实现
文章图片
3、使用 ShortenedThrowableConverter 来优化异常堆栈
1、新建
logback-spring.xml
配置文件2、通过
conversionRule
来使用文章图片
3、具体用法
文章图片
参数解释:
stack{100,16,2048,rootFirst,regex1,regex2,evaluatorName}
参数解释: 建议查看源码 net.logstash.logback.stacktrace.ShortenedThrowableConverter#parseOptions() 方法
第1参数: maxDepthPerThrowable:值可以是 full或者short或者int值,表示每个异常最多打印多少个 stackTraceElements 元素
第2参数: shortenedClassNameLength:值可以是 full或者short或者int值,将尝试将类名长度缩短到小于此值
com.huan.springboot.service.ExceptionService 可能会变成 c.h.s.s.ExceptionService
第3参数: maxLength:值可以是 full或者short或者int值,指的输出到日志中整个堆栈最大能存在多少个字符。
后面这些参数没有固定顺序
第4参数: rootFirst: 可选参数,如果使用该参数,值就是 rootFirst ,表示应首先打印堆栈的根本原因
第5参数: inlineHash: 可选参数,如果使用该参数,值就是 inlineHash, 指示应该计算和内联十六进制错误哈希
如果参数都不是上方的类型,那么可能是 evaluator 或者 exclude 类型,这2个都是判断这个 stackTraceElement 是否应该被打印,这2个参数没有顺序关系
evaluator: 值的是需要实现 EventEvaluator 的类
exclude: 指的是需要排除的正则表达式, 如果存在.需要转义成 \.
4、查看运行结果
文章图片
和我们的需求对比,发现已经实现了我们想要的结果,这样异常堆栈信息也简化了
。五、完整代码 【在SpringBoot中使用logback优化异常堆栈的输出】https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-logback-json-optimize-exception
六、参考文档 1、https://github.com/logstash/logstash-logback-encoder
2、https://github.com/logfellow/logstash-logback-encoder/blob/main/stack-hash.md
3、https://www.srccodes.com/shorten-logger-name-customize-optimize-exception-stack-traces-logback-logstashencoder-shortenedthrowableconverter/
推荐阅读
- 投稿|中青宝,“打亲骂爱”不意外
- e555. 在Applet中播放音频
- Android-Kotlin在Fragment获取View
- MyBatis mapper.xml中SQL处理小于号与大于号 和小于等于号
- SpringBoot通过@Value获取application.yml配置文件的属性值
- 人工智能|关于NLP相关技术全部在这里(预训练模型、信息抽取、文本生成、知识图谱、对话系统...)
- 大数据|关于NLP相关技术全部在这里(预训练模型、图神经网络、模型压缩、知识图谱、信息抽取、序列模型、语法分析、文本处理...)
- android在主线程下载文件
- 为什么那么多公司都选择灵活用工?
- SpringBoot基础