1.背景在编写程序的过程中,我们无法保证我们的代码不会抛出异常。当我们抛出异常时,通常会使用日志来记录整个异常堆栈的信息。通常一个完整的异常栈的信息很多,也有一些无用的信息。那么我们如何优化一些异常栈的信息打印,过滤掉不需要的信息呢?二、需求1、已有的异常堆栈信息2、我们要优化如下。三、使用的技术1、这里使用SpringBoot中的logback来打印日志。2.默认重写异常栈的打印比较复杂。这里我们使用ogstash-logback-encoder的第三方实现来实现。3.这里我们使用ogstash-logback-encoder的ShortenedThrowableConverter来实现。这个可以用在json格式的日志输出中,也可以用在非json格式的日志中。我们将使用它以非json格式记录输出。四、技术实现1、引入依赖org.springframework.bootspring-boot-starter-webnet.logstash.logbacklogstash-logback-encoder7.1.1注意:使用logstash-logback-encoder时会有一些依赖。我目前使用的依赖如下:1.如果出现异常2.jdk的版本依赖不同的版本,可能依赖的版本也不一样,建议查看官网:https://github.com/logfellow/logstash-logback-encoder#java-version-requirements2.代码实现3.使用ShortenedThrowableConverter优化异常栈1.新建logback-spring.xml配置文件2.使用conversionRule3.具体使用参数解释:stack{100,16,2048,rootFirst,regex1,regex2,evaluatorName}参数解释:建议查看源码net.logstash.logback.stacktrace.ShortenedThrowableConverter#parseOptions()方法1号参数:maxDepthPerThrowable:该值可以是full或short或int,表示每次异常最多打印多少个stackTraceElements元素2ndparameter:shortenedClassNameLength:value可以是fullorshortorintvalue,会尝试将类名长度缩短到小于这个值com.huan.springboot.service.ExceptionService可能会变成c.h.s.s.ExceptionService3rdparameter:maxLength:value可以是full或short或int值,指的是输出日志中整个堆栈中可以存在的最大字符数。这些参数没有固定的顺序。第四个参数:rootFirst:可选参数。如果使用该参数,则值为rootFirst,表示应该是第一个打印栈的根本原因第5个参数:inlineHash:可选参数,如果使用,则值为inlineHash,表示应该计算十六进制错误散列而inlined如果参数都不是以上类型,则可能是evaluator或者exclude类型,这两个是判断stackTraceElement是否要打印,这两个参数没有顺序关系evaluator:值为需要的类实现EventEvaluatorexclude:指需要排除的正则表达式,如果存在需要转义成\.4,查看运行结果对比我们的需求,发现已经是我们想要的结果实现了,所以异常堆栈信息也被简化了。五、完整代码https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-logback-json-optimize-exception六、参考文档1、https://github.com/logstash/logstash-logback-encoder2、https://github.com/logfellow/logstash-logback-encoder/blob/main/stack-hash.md3、https://www.srccodes.com/shorten-logger-name-customize-optimize-exception-stack-traces-logback-logstashencoder-shortenedthrowableconverter/