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
相关产品推荐
相关产品推荐

