一、背景

在我们在编写程序的过程中,无法保证自己的代码不抛出异常。当我们抛出异常的时候,通常会将整个异常堆栈的信息使用日志记录下来。通常一整个异常堆栈的信息是比较多的,而且存在一些没用的信息。那么我们如何优化一些异常堆栈的信息打印,过滤掉不必要的信息呢?

二、需求

1、现有的异常堆栈信息

2、我们想优化成如下

三、使用的技术

1、此处我们是在SpringBoot中使用logback来实现日志的打印。

2、默认情况下,重写异常堆栈的打印比较复杂,此处我们采用第三方实现 ogstash-logback-encoder 来实现。



3、那么此处我们就采用 ogstash-logback-encoder 的 ShortenedThrowableConverter来实现。这个可以在以json格式的日志输出中使用,也可以使用到非json格式的日志中使用。我们将会用在以非json格式日志的输出。

四、技术实现

1、引入依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- 引入此jar包,可以将日志以json的格式输出,可以简化异常信息的输出 -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.1.1</version>
</dependency>

注意:

使用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<ILoggingEvent> 的类
exclude: 指的是需要排除的正则表达式, 如果存在.需要转义成 \.

4、查看运行结果



和我们的需求对比,发现已经实现了我们想要的结果,这样异常堆栈信息也简化了。

五、完整代码

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/

在SpringBoot中使用logback优化异常堆栈的输出的更多相关文章

  1. 在SpringBoot中添加Logback日志处理

    前言 SpringBoot项目中在官方文档中说明,默认已经依赖了一些日志框架.而其中推荐使用的就是Logback,所以这一次我将在我的模版中加入Logback日志的配置,说明一下,SpringBoot ...

  2. springboot中使用logback

    原文地址:https://blog.csdn.net/tianyaleixiaowu/article/details/73321610 Springboot默认集成的就是logback,logback ...

  3. SpringBoot中注入RedisTemplate实例异常解决(转)

    最近,在项目开发过程中使用了RedisTemplate,进行单元测试时提示“Field redisTemplate in com.example.demo1.dao.RedisDao required ...

  4. SpringBoot中pom引入gson异常

    在pom中引入gson依赖,启动spring boot项目中报错 Description:An attempt was made to call the method com.google.gson. ...

  5. SpringBoot(三) - Slf4j+logback 日志,异步请求,定时任务

    1.Slf4j+logback 日志 SpringBoot框架的默认日志实现:slf4j + logback: 默认日志级别:info,对应了实际生产环境日志级别: 1.1 日志级别 # 常见的日志框 ...

  6. 【转】堆栈跟踪中收到一个UnhandledExceptionFilter调用时,如何查找问题异常堆栈

    定义没有异常处理程序来处理引发的异常时调用UnhandledExceptionFilter函数.函数通常将异常传递到捕获并处理它所尝试的 Ntdll.dll 文件. 在某些情况下,在其中存在的进程内存 ...

  7. 在SpringBoot项目中添加logback的MDC

    在SpringBoot项目中添加logback的MDC     先看下MDC是什么 Mapped Diagnostic Context,用于打LOG时跟踪一个“会话“.一个”事务“.举例,有一个web ...

  8. springboot中动态修改logback日志级别

    springboot中动态修改logback日志级别 在spring boot中使用logback日志时,项目运行中,想要修改日志级别. 代码如下: import org.slf4j.Logger; ...

  9. SpringBoot中Logback日志的配置

    说明 在SpringBoot中自带的日志工具是Logback,我们可以在Springboot的配置文件中直接对Logback进行一些简单的配置,如: logging.level.com.nowcode ...

随机推荐

  1. java-第三方工具去做一些校验

    推荐大家使用第三方 jar 的工具类去做判空.比如:从 Map 中取一个 key 的值,可以用 MapUtils 这个类:对字符串判空使用 StringUtils 这个类:对集合进行判空使用 Coll ...

  2. Spring 应用程序有哪些不同组件?

    Spring 应用一般有以下组件:接口 - 定义功能.Bean 类 - 它包含属性,setter 和 getter 方法,函数等.Spring 面向切面编程(AOP) - 提供面向切面编程的功能.Be ...

  3. 机器学习综合库gensim 简单搞定文本相似度

    不废话直接代码吧 # 1.模块导入 import jieba import gensim from gensim import corpora from gensim import models fr ...

  4. 顺利通过EMC实验(11)

  5. 2018 百度web前端面试

    面试前 正式入职一年半左右,实习半年,勉强两年经验吧,然后很惊喜收到了百度的面试邀约,约得两点钟面试,然后本人一点钟就到了,通电话之后,面试官很热情,说正在吃饭吃完饭就去找我,让我去坐着等一会,然后一 ...

  6. html5知识点补充—footer元素的使用

    使用footer元素创建脚注 顾名思义,footer元素通常位于页面的底部.尽管footer通常位于某个区域或者页面的底部,但并非总是如此.footer元素旨在包含作者.网站所有者.版权数据.网站规章 ...

  7. [computer vision] Bag of Visual Word (BOW)

    Bag of Visual Word (BoW, BoF, 词袋) 简介 BoW 是传统的计算机视觉方法,用一些特征(一些向量)来表示一个图像.BoW的核心思想是利用一组较为通用的特征,将图像用这些特 ...

  8. Initialization failed for 'https://start.spring.io

    本文精华(没空的小伙伴,直接看精华部分即可) 1.精华1: 开发/下载项目的时候考虑系统必备的版本兼容性 2.精华2: 通过火狐浏览器访问官网的旧版本,下载到任意需要的项目版本,然后通过项目导入ide ...

  9. xml中的<![CDATA[]]>和转义字符

    被<![CDATA[]]>这个标记所包含的内容将表示为纯文本,比如<![CDATA[<]]>表示文本内容"<". 此标记用于xml文档中,我们先 ...

  10. OllyDbg---寄存器

    寄存器 寄存器的概念和作用 寄存器是CPU内部的高速存储单元,访问速度比常规内存快很多. 处理器在执行程序时,需要一个助手,当执行一条指令时,比如将两个内存单元中存放的内容相加,处理器需要先把其中一个 ...