日志记录当前类和当前方法

背景 & 问题

公司日志记录方式:每次记录日志的时候都会记录这个日志是在哪个类,哪个方法中记录的。 这个行为很好理解,看日志的时候能够更加快速定位到日志打印的位置。 可是他们得到纪录类和记录方法是直接在代码中写死类名和方法名的,这就造成了每个打印日志地方都要手动去写这个类名和方法名,实在是太繁琐了,然后我就想解决一下。

当前记录方式:

调研分析

我的初衷就是为了简化打印当前类和当前方法的方式,想去写一个工具类,里面写一个工具方法,功能就是:帮忙打印调用这个工具方法的类和具体方法名。这样的话在每次日志记录就不需要那么麻烦自己手写类名和方法名了。

自己分析可行性:一个线程进来执行嵌套方法,没有完成的方法是需要入栈的,这个栈是线程私有的,所以java中是不是提供了对这个栈进行查看的api?

带着这个问题,我去网上调研了一下,发现jdk的确是有提供入栈方法对外查询的方式的。

java 复制代码
Thread.currentThread().getStackTrace()

这个返回是个数组格式,越往前调用的方法在越前面,0号位置固定是getStackTrace(),因为它本身也是一个方法,所以在0号位置,也就是最前面的位置

举个例子:在A类的a方法中调用B类的b方法,在b方法中调用C类的c方法,在C方法中调用Thread.currentThread().getStackTrace() ,所以此时栈中信息如下图所示:

所以此时在c方法中取1号位置元素就能得到c方法所处类和所处方法,代码如下:

java 复制代码
public void c() {
    // 获取当前线程的StackTraceElement数组
    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    String className = stackTrace[1].getClassName();
    String methodName = stackTrace[1].getMethodName();
    System.out.println(className + " => " + methodName);
}

具体解决

根据上面那个调研,我们已经知道解决办法了,但是我不想在每个地方都写getStackTrace,我想封装一个工具类,里面写一个工具方法,在需要调用的时候,我直接调用就好了,所以此时就在C.c和Thread.getStackTrace之间多了一层工具方法调用,此时栈中信息如下所示:

所以此时我们应该固定调用的是2号位置元素,工具类具体代码如下:

java 复制代码
public class CurClassAndMethodUtil {

    public static void getCurClazzAndMethod() {
        // 获取当前线程的StackTraceElement数组
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        // 由于这里提取了一个工具类出来,所以直接取第三个位置的。第一个位置是getStackTrace本身
        String className = stackTrace[2].getClassName();
        String methodName = stackTrace[2].getMethodName();
        System.out.println(className + " => " + methodName);
    }

}

完美解决!!!

总结

  • 了解了线程私有的方法调用链路:getStackTrace。
  • 对getStackTrace进行了详细了解,解决了我们打印当前类和方法的问题。
相关推荐
ZhengEnCi5 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
王中阳Go5 小时前
后端转 Agent 岗面试怎么答:8 个高频问题与应答口径
人工智能·后端·python·大语言模型
程序猿DD5 小时前
OctaFuse Gateway 2.18.0:MCP 接入支持 OAuth,供应商粘性绑定可视化管理
后端
ZhengEnCi7 小时前
Agent 规则管理:让 Memory 做索引、让 Skill 存规则——上下文上限实测与分工方案
后端
nice_lcj5208 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
骑着蜗牛撵大象3278 小时前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治
java·人工智能·后端·spring·ai·可观测性·mcp
摸爬滚打的小李9 小时前
Spring XML + WAR + Tomcat 项目启动
后端
IT_陈寒10 小时前
SpringBoot自动配置的坑,这次终于爬出来了
前端·人工智能·后端
RainbowFish10 小时前
# RAG 与智能体记忆:从原理到工程实践 > 一篇给学习者的总结。
后端
苏三说技术10 小时前
为什么越来越多人用Arthas 4 ?
后端