为什么要打出环境信息
作为一个中间件,它可能被运行在各种意想不到的环境下。在JVM启动后第一句代码先将当前的环境信息打出,我们就可以通过这些日志确保JVM已经启动成功(但现在还没开始基本的功能初始化),后续出现初始化的问题,我们就可以通过日志,可以看出一些与环境有关的问题。
Kafka Connect
Kafka中的Connect模块就是一个很好的例子,它在启动的第一步就是打印环境信息,细节见JIRA链接。
直接贴代码,Kafka使用了RuntimeMXBean与OperatingSystemMXBean两个类来获取环境信息:
private static final RuntimeMXBean RUNTIME;
private static final OperatingSystemMXBean OS;
static {
RUNTIME = ManagementFactory.getRuntimeMXBean();
OS = ManagementFactory.getOperatingSystemMXBean();
}
用RUNTIME对象可以拿到启动参数、虚拟机相关信息、Java版本,以及Class路径
protected void addRuntimeInfo() {
List<String> jvmArgs = RUNTIME.getInputArguments();
values.put("jvm.args", Utils.join(jvmArgs, ", "));
String[] jvmSpec = {
RUNTIME.getVmVendor(),
RUNTIME.getVmName(),
RUNTIME.getSystemProperties().get("java.version"),
RUNTIME.getVmVersion()
};
values.put("jvm.spec", Utils.join(jvmSpec, ", "));
values.put("jvm.classpath", RUNTIME.getClassPath());
}
用OS对象,可以获取操作系统、架构、版本,以及JVM可用的Processor数量等信息:
protected void addSystemInfo() {
String[] osInfo = {
OS.getName(),
OS.getArch(),
OS.getVersion(),
};
values.put("os.spec", Utils.join(osInfo, ", "));
values.put("os.vcpus", String.valueOf(OS.getAvailableProcessors()));
}