gpt4 book ai didi

java - 如何确定在运行时调用了哪个类的 `main` 方法?

转载 作者:行者123 更新时间:2023-11-29 06:17:05 28 4
gpt4 key购买 nike

我想动态确定哪个类的主要方法被调用,以便更容易消化组合日志文件。

目前,单个(旋转的)日志文件聚合了多个守护进程的所有日志输出,但是没有明显的方法可以确定日志条目来自哪个守护进程,因为所有守护进程都使用共享代码库,记录器是使用 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;
}
}

感谢您的建议!

最佳答案

如果您只需要执行一次,您可以遍历异常堆栈并查看最后的类/方法调用。

    StackTraceElement[] elem = new Exception().getStackTrace();
elem[elem.length - 1].getClassName();

但是容易出错。如果我通过反射加载你的类,你会在顶部看到一个完全不同的方法。

您可以尝试 M.Jessup 变体(匹配 main 方法签名),但如果我也从代码中调用 main 方法,它将失败。

关于java - 如何确定在运行时调用了哪个类的 `main` 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4681558/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com