当前位置: 首页 > article >正文

Java获取自身被调用点

1. 场景

打印日志的时候,需要获取是在哪个地方被调用了,把调用点的信息一并打印出来。

2. 获取自身被调用点的方法

可以通过获取线程的调用栈,遍历后找到调用点。

3. 代码实现

import java.text.SimpleDateFormat;
import java.util.Date;

public class Log {
    private static final String INFO = "INFO";
    private static final String WARN = "WARN";
    private static final String ERROR = "ERROR";
    private static final String DEBUG = "DEBUG";
    private static final String THREAD_CLASS_NAME = Thread.class.getName();
    private static final String SELF_CLASS_NAME = Log.class.getName();
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    private static StackTraceElement findCallPoint() {
        Thread currentThread = Thread.currentThread();
        StackTraceElement[] stackTraces = currentThread.getStackTrace();
        for (StackTraceElement stackTrace : stackTraces) {
            if (THREAD_CLASS_NAME.equals(stackTrace.getClassName()) || SELF_CLASS_NAME.equals(stackTrace.getClassName())) {
                continue;
            }
            return stackTrace;
        }
        return null;
    }

    private static String getMsgPrefix(String msgType) {
        StackTraceElement callPoint = findCallPoint();
        if (callPoint == null) {
            return "-";
        }
        return String.format("%s  %s --- %s(%d)  \t%s()\t", DATE_FORMAT.format(new Date()), msgType,
                callPoint.getClassName(), callPoint.getLineNumber(), callPoint.getMethodName());
    }

    public static void info(String msg) {
        System.out.println(getMsgPrefix(INFO) + msg);
    }

    public static void warn(String msg) {
        System.out.println(getMsgPrefix(WARN) + msg);
    }

    public static void error(String msg) {
        System.out.println(getMsgPrefix(ERROR) + msg);
    }

    public static void debug(String msg) {
        System.out.println(getMsgPrefix(DEBUG) + msg);
    }
}

4. 测试

测试代码:

package com.example.study.controller;

public class Test {
    public static void main(String[] args) {
        Log.info("=====testLog main=====");
        testLog();
    }

    private static void testLog() {
        Log.info("=====testLog info=====");
        Log.warn("=====testLog warn=====");
        Log.error("=====testLog error=====");
        Log.debug("=====testLog debug=====");
    }
}

控制台输出:

2024-12-26 23:18:35.313  INFO --- com.example.study.controller.Test(7)  	main()	=====testLog main=====
2024-12-26 23:18:35.315  INFO --- com.example.study.controller.Test(12)  	testLog()	=====testLog info=====
2024-12-26 23:18:35.315  WARN --- com.example.study.controller.Test(13)  	testLog()	=====testLog warn=====
2024-12-26 23:18:35.315  ERROR --- com.example.study.controller.Test(14)  	testLog()	=====testLog error=====
2024-12-26 23:18:35.315  DEBUG --- com.example.study.controller.Test(15)  	testLog()	=====testLog debug=====

http://www.kler.cn/a/453322.html

相关文章:

  • 机器学习(二)-简单线性回归
  • c/c++ 无法跳转定义
  • 拉普拉斯分布极大似然估计
  • Java线程池面试题
  • Java爬虫实战:深度解析VIP商品详情获取技术
  • 使用helm安装canal-server和canal-admin
  • 【ES6复习笔记】Symbol 类型及其应用(9)
  • 前端学习DAY27(盒子模型内边距)
  • Idea 配置环境 更改Maven设置
  • Python爬虫获取1688详情接口详细解析
  • 红魔电竞PadPro平板解BL+ROOT权限-KernelSU+LSPosed框架支持
  • yum 查看已安装软件信息
  • 【无线通信】蜂窝系统——干扰与系统容量
  • 磁盘结构、访问时间、调度算法
  • 微信小程序给外面的view设置display:flex;后为什么无法给里面的view设置宽度
  • OVS简介
  • Elasticsearch-模糊查询
  • C语言学习(10)—递归
  • git回退指定版本/复制提交id
  • 【算法题解】Berland 路标限速问题(Follow Traffic Rules)
  • Google Cloud Architect 认证考试错题集7
  • 华三M-LAG场景下,部分MAC内的流量泛洪导致端口流量打满
  • 信创数据防泄漏中信创沙箱是什么样的安全方案
  • 配置带外与更改密码
  • upload-labs关卡记录11
  • ViT-Reg:面向tinyML平台的回归聚焦型硬件感知微调Vision Transformer