我有一堆小服务,通常称为Microservices ;-),它们都有相同的启动行为。它们被安排在包装中-每个包装用于一项服务。软件包命名如下:
com.foo.bar.Application
其中com.foo是域部分,bar是实际的服务名称,Application是我的使用main方法的主要实例类。
现在,我想做的是在启动时打印出一条标准的日志消息,其中显示了用户可以查询以获取有关该服务的某些信息的URL。根据定义,获取服务信息的URL的格式应如下所示:
IP:PORT/bar/admin/info
我试图用getClass()来获得这个bar.name……之类的,但这是行不通的。所以我尝试了这个:
LOG.info("Access URLs:\n----------------------------------------------------------\n" +
"\tLocal: \t\thttp://127.0.0.1:{}/" + getMyClass() + "/info\n" +
"\tExternal: \thttp://{}:{}/" + getMyClass() + "/info\n----------------------------------------------------------",
env.getProperty("server.port"),
InetAddress.getLocalHost().getHostAddress(),
env.getProperty("server.port")
);
/**
* Get the name of the application class as a static value, so we can show it in the log
*/
public static final Class[] getClassContext() {
return new SecurityManager() {
protected Class[] getClassContext(){return super.getClassContext();}
}.getClassContext();
};
public static final Class getMyClass() { return getClassContext()[2];}
但是,正如您可能已经猜到的那样,打印出来的内容太多了:
class com.foo.bar.Application
我想要得到的是
bar
我该如何实现???
顺便说一句,我正在使用Java 8和Spring启动-如果有帮助
最好的祝福,
克里斯
您可以先尝试从类中检索包对象,然后读取其名称。以下代码将在packageName
变量中为您提供完整的包含程序包名称(例如“ com.foo.bar”),并在变量中为您提供直接父名称(例如bar
)directParent
:
String packageName = getMyClass().getPackage().getName();
String directParent;
if(packageName.contains(".")) {
directParent = packageName.substring(1 + packageName.lastIndexOf("."));
} else {
directParent = packageName;
}
因此,如果将您的日志语句放在此代码段之后,则只能使用这些变量之一。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句