我经常会从Java中向我的日志文件发送调试信息,它有助于提供关于代码中生成日志消息的位置的正确信息,以便我可以快速参考它。我不想在日志消息中对其位置进行硬编码,因为如果我重命名其方法或者将代码重构为不同的结构,我必须记住更新日志消息。我希望有一个静态函数,只返回调用函数的类和方法名称。例如,如果我有一个名为Machine的类和一个名为doStuff的方法,我希望该方法中的日志消息生成代码看起来像这样:
String log_msg = Blah.getClassAndMethodName()+" did the wrong thing!";
类Blah中的静态方法getClassAndMethodName()将返回“Machine.doStuff”。这样,当我查看日志文件时,我可以轻松地告诉代码在哪里生成消息。我意识到这有点棘手,因为我需要Blah中的这个方法在一个单独的类Machine中返回有关其调用函数的信息,但是这样可以很容易地在任何地方使用这个静态调用。
我不知道这是否可行,但我很感激任何答案!另外,假设有可能,这是一种特别高的开销类型的操作吗? (我假设需要反思,而不是我的强项)
谢谢!
答案 0 :(得分:8)
如果您拨打Thread.getStackTrace(),则可以从那里确定您的电话筹码。
返回堆栈跟踪数组 表示堆栈转储的元素 这个帖子。这种方法会 如果这样,则返回零长度数组 线程尚未启动或有 终止。如果返回的数组是 非零长度然后第一个 数组的元素代表 堆栈的顶部,这是最多的 最近的方法调用 序列。最后一个元素 数组代表底部 堆栈,这是最近的 序列中的方法调用。
重新。性能。我不能建议你测量它。如果您的调试输出可以启用/禁用,我会确保您只在启用启用调试输出时执行上述操作,因此您只需在需要时获取性能。
答案 1 :(得分:2)
试试这个:
public static Log make() {
Throwable t = new Throwable();
StackTraceElement directCaller = t.getStackTrace()[1];
return LogFactory.getLog(directCaller.getClassName());
}
stacktrace中的第一个条目是调用类
答案 2 :(得分:1)
考虑使用日志框架来执行此操作。
我相信标准的Java 1.4 java.util.logging。*允许你想要的东西。