【发布时间】:2011-01-14 02:02:20
【问题描述】:
我想动态确定调用了哪个类的 main 方法,以便更容易消化组合日志文件。
目前,单个(循环)日志文件汇总了多个守护进程的所有日志输出,但没有明显的方法可以确定日志条目源自哪个守护进程,因为所有守护进程都使用共享代码库,并且记录器是用 log4j 的 getLogger(Something.class) 创建的
由于我们一开始使用的是自定义 Layout 类,因此实际上输出信息不是问题,但找到它是问题。
一种可以作为后备的方法是在调用时定义一个属性并读取该属性。
java -cp ... -Dmain.program=<WHATEVER> MainProgram
但是,如果该功能已经存在,则无需创建新约定。
更新:出于我的目的,以下似乎工作正常:
import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggingEvent;
public class MyLayout extends PatternLayout {
private static String _mainClass = null;
public String format( LoggingEvent event ) {
String mesg = super.format( event );
if (mesg.indexOf("$main") > -1) {
mesg = mesg.replaceAll("\\$main", getMainClass());
}
return mesg;
}
private static String getMainClass() {
if (_mainClass == null) {
StackTraceElement[] elem = new Exception().getStackTrace();
int offset = elem.length - 1;
if (elem[offset].getMethodName().equals("main")) {
_mainClass = elem[offset].getClassName();
}
else {
_mainClass = "<Unknown_Main_Class>";
}
}
return _mainClass;
}
}
感谢您的建议!
【问题讨论】:
-
我刚刚在我的博客中发表了我对这个话题的想法:alexradzin.blogspot.com/2011/01/get-program-entry-point.html
-
这是我倾向于的解决方案(验证线程是否命名为 main,在名为 main 的 ThreadGroup 中),但出于我的目的,不需要尽可能通用。如果我需要在更多情况下工作的更通用的解决方案,我肯定会使用这种方法。
标签: java main-method