[日志] 打印异常堆栈信息的技巧

news/2025/1/22 18:16:08/文章来源:https://www.cnblogs.com/johnnyzen/p/18686568

  • Java的异常堆栈信息,对提升排查问题的效率,有极大的帮助————便于我们快速定位异常的发生过程和发生异常的代码行。

  • 本文使用的日志框架

  • slf4j : 1.7.25
  • log4j(2) : 2.20.0
  • 日志行的打印策略 : log4j2.properties
# property.log.layout.consolePattern=%d{yyyy/MM/dd HH:mm:ss.SSS} %-5p | %T | %t | (%C{1}.java:%L %M) | %m%n
# property.log.layout.consolePattern=[%d{yyyy/MM/dd HH:mm:ss.SSS}] [%traceId] [%-5p] [%t] [%C{1}.java:%L %M] %m%n
#property.log.layout.consolePattern=[%d{yyyy/MM/dd HH:mm:ss.SSS}] [%X{traceId}] [%-5p] [%t] [%C{1}.java:%L %M] %m%n
property.log.layout.consolePattern=[%traceId] [${application.name}] [system] [%d{yyyy/MM/dd HH:mm:ss.SSS}] [%-5p] [%t] [%C{1}] %M:%L__|%X{traceId}|__%m%n
#property.log.layout.mainPattern=[${application.name}] [${instance.name}] [${env:HOST_IP}] [${env:CONTAINER_IP}] [%d{yyyy/MM/dd HH:mm:ss.SSS}] [%p] [%t] [%l] %m%n...# console
# 指定输出源的类型与名称
appender.console.type=Console
appender.console.name=CONSOLE_APPENDER
#appender.console.layout.type=PatternLayout
appender.console.layout.type=CustomPatternLayout
appender.console.layout.pattern=${log.layout.consolePattern}...

打印异常堆栈信息的技巧

错误示范

  • 错误的关键:不应该使用{}
package xxx.yyy.zzz;//import lombok.extern.slf4j.Slf4j;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;//@Slf4j
public class Demo {private static final Logger log = LoggerFactory.getLogger(Demo.class);public static void main(String[] args) {try {test();} catch (Exception exception) {log.info("exception.message:{}\nexception:{}", exception.getMessage(), exception);}}public static void test(){System.out.println("hello");throw new RuntimeException("Xxxx abnormal!");}
}

运行效果: 未打印出堆栈信息

hello
[TID: N/A] [my-app-service] [system] [2025/01/22 18:07:37.956] [INFO ] [main] [Demo] main:16__||__exception.message:Xxxx abnormal!
exception:java.lang.RuntimeException: Xxxx abnormal!

正确示范

  • 正确的关键:想打印出堆栈,就不要使用{}
package xxx.yyy.zzz;//import lombok.extern.slf4j.Slf4j;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;//@Slf4j
public class Demo {private static final Logger log = LoggerFactory.getLogger(Demo.class);public static void main(String[] args) {try {test();} catch (Exception exception) {log.info("exception.message:{}\nexception:", exception.getMessage(), exception);}}public static void test(){System.out.println("hello");throw new RuntimeException("Xxxx abnormal!");}
}

运行效果: 打印出了堆栈信息

hello
[TID: N/A] [my-app-service] [system] [2025/01/22 18:09:41.949] [INFO ] [main] [Demo] main:16__||__exception.message:Xxxx abnormal!
exception:
java.lang.RuntimeException: Xxxx abnormal!at xxx.yyy.zzz.Demo.test(Demo.java:22) ~[classes/:?]at xxx.yyy.zzz.Demo.main(Demo.java:14) [classes/:?]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/873360.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vjudge训练记录】大一寒假专项训练——前缀和/差分

训练情况A题 前缀和模板题,我们输入完 \(a_i\) 后直接求前缀和 \(a_i = a_i + a_{i-1}\),求区间 \([l,r]\) 的和就为 \(a_r-a_{l-1}\)点击查看代码 #include <bits/stdc++.h> #define int long long #define endl \nusing namespace std;void solve(){int n,m;cin>&…

VSCode使用之go语言配置

时间:2025/1/22 扩展:go 目的:支持go语言,方便安装其他必备插件安装该扩展包后可以执行该扩展包提供的命令Go:Install/Update Tools来进一步扩展go工具执行命令的窗口可以通过Ctrol+Shift+P调出点击后会出现很多选项,可以根据自己需要勾选然后点击确定,等待下载安装,一般情…

VSCode设置之默认在当前文件目录下打开终端

在vscode界面依次点击“文件”→“首选项”→“设置”→“用户”→“功能”→“终端”,找到Integrated:Cwd选项,将其值修改为”${fileDirname}“,即可在所有打开的工程内实现终端默认在当前文件的路径启动

树上的轮廓线DP!——AGC017F Zigzag

树上的轮廓线DP!——AGC017F Zigzag 注意到 \(n,m\le 20\),考虑状压,设 \(f_{i,S}\) 表示对于第 \(i\) 条线,其路线为 \(S\) 的方案数。 转移需要枚举 \(f_{i-1,S}\) 复杂度 \(\mathcal O(4^n\text{poly}(n))\)。 发现这种相邻状态之间的限制很像矩形中行的扩展,于是我们可…

使用 CSS flex(横向) 实现瀑布流布局(需要后端配合数据分左右)

核心代码(提供思路)<up-waterfall v-model="flowList"><template v-slot:left="{leftList}"><view v-for="(item, index) in leftList" :key="index"><!-- 这里编写您的内容,item为您传递给v-model的数组元素…

htb LinkVortex walkthrough

nmapnmap -p- -A -sS -T 4 10.10.11.47 Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-22 00:58 UTC┌──(root㉿kali)-[/home/ftpuserr] └─# nmap -p- -A -sS -T4 10.10.11.47 Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-22 00:58 UTC Stats: 0:02:28 ela…

网络抓包文件太大,如何切分

背景 节前最后几天了,随便写点水文吧,今天就记录一下,当我们拿到的网络抓包文件太大,应该怎么分析。 一般来说,我们个人抓包的话,linux上用tcpdump比较多,抓的时候也会用捕获表达式,抓出来的包一般不大,用wireshark分析就很容易。 但是,前一阵的一个晚上,dba突然找我…

java进程内存占用分析

一、背景 1.1 问题描述 不知道大家在开发过程中有没有遇到过类似的问题,明明通过JVM参数-Xmx256m设置了最大堆内存大小为256m,但是程序运行一段时间后发现占用的内存明显超过了256m,却并没有出现内存溢出等问题,那是什么东西占用了额外的内存空间呢? 通过ps查看java进程项…

《ESP32-S3使用指南—IDF版 V1.6》第三章 ESP32-S3基础知识

第三章 ESP32-S3基础知识 1)实验平台:正点原子DNESP32S3开发板 2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6 3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp3…

GDB - 查看崩溃程序maps映射表

可执行程序如何通过gdb查看映射信息? 在终端中打开gdb调试器:gdb 可执行文件名。 进入gdb调试器后,使用命令info proc mapping查看可执行程序的映射信息。 这个命令将会输出可执行程序的内存映射信息,包括可执行文件的代码段、数据段、堆和栈等信息,以及共享库的地址空间等…

Anthropic 计划为 Claude 发布「双向」语音模式;商汤「日日新」实时音视频对话服务开放商用丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…