You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eclipse E4 RCP Logger:如何获取日志调用类或包信息?

解决方案

要在统一日志类中自动记录调用者的类/包信息,无需每个类单独实现Logger,有两种实用方法:

方法一:通过调用栈自动获取调用者类名

在你的日志类A中,通过线程的调用栈信息定位到实际调用日志方法的类,再将类名拼接进日志消息。这种方式无需修改调用代码,完全透明。

修改后的A类代码:

import org.eclipse.e4.core.services.log.Logger;
import org.eclipse.ui.PlatformUI;

class A {
    private static final Logger logger = PlatformUI.getWorkbench().getService(Logger.class);
    
    public static void info(String message) {
        String callerClass = getCallerClassName();
        if (callerClass != null) {
            // 提取简单类名(比如从"com.example.B"得到"B")
            String simpleClassName = callerClass.substring(callerClass.lastIndexOf('.') + 1);
            logger.info(String.format("Class %s: %s", simpleClassName, message));
        } else {
            logger.info(message);
        }
    }
    
    private static String getCallerClassName() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        // 遍历调用栈,跳过当前类的方法,找到第一个外部调用者
        for (StackTraceElement element : stackTrace) {
            String className = element.getClassName();
            if (!className.equals(A.class.getName())) {
                return className;
            }
        }
        return null;
    }
}

调用B.info("Foobar")后,日志会输出类似:!MESSAGE Class B: Foobar,完全符合需求。

注意事项

  • 调用栈获取会有轻微性能开销,若日志调用量极大,可考虑仅在Debug模式下启用该逻辑。
  • 若需要包信息,直接使用callerClass全类名即可,无需提取简单类名。

方法二:利用E4 Logger的类绑定特性

E4的Logger支持针对特定类实例化,你可以在日志类中为调用者动态创建对应Logger,但无需每个类单独持有Logger实例:

修改后的A类代码:

import org.eclipse.e4.core.services.log.Logger;
import org.eclipse.ui.PlatformUI;
import org.eclipse.e4.core.services.log.LogService;

class A {
    private static final LogService logService = PlatformUI.getWorkbench().getService(LogService.class);
    
    public static void info(String message) {
        String callerClass = getCallerClassName();
        if (callerClass != null) {
            try {
                Class<?> clazz = Class.forName(callerClass);
                Logger callerLogger = logService.getLogger(clazz);
                callerLogger.info(message);
            } catch (ClassNotFoundException e) {
                // 回退到默认Logger
                logService.getLogger(A.class).info(message);
            }
        } else {
            logService.getLogger(A.class).info(message);
        }
    }
    
    private static String getCallerClassName() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        for (StackTraceElement element : stackTrace) {
            String className = element.getClassName();
            if (!className.equals(A.class.getName())) {
                return className;
            }
        }
        return null;
    }
}

这种方式会让E4 Logger自动将调用者类的信息写入日志的上下文字段(比如日志的归属包或Logger名称字段),最终日志不仅会显示消息,还会在头部标识调用者类的来源。

内容的提问来源于stack exchange,提问作者BCuracao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:45:29