JMX学习以及在log4j中的应用

jopen 9年前

前言

JMX即Java Managemen Extensions,是一个为应用程序植入管理功能的框架。一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。

常常在编程的过程中有一些配置信息需要动态的进行改变,我以往会有如下几种做法:

  1. 写死在Java code中,环境发生变化的时候修改Java code

  2. 写在名为*.properties的配置文件里,使用Java读取配置文件

然而今天我们将引入一种高级的方式来进行配置信息的管理,那便是JMX的引入。

如何使用JMX

JMX做为一份规范,JDK中提供了JMX接口,因此安装了JDK后就可以开发基于JMX的代码了。

JMX具有两层结构,各层的组件如下

工具层

  1. Mbeans

  2. 通知模型:Notification、NotificationListener

  3. Mbeans与数据类:Attribute、Operator

代理层

  1. MBean Server

  2. 代理服务


下面学习下log4j2对JMX的支持

JMX-log4j2

Log4j 2 开始支持 JMX. StatusLogger, ContextSelector, 和所有的 LoggerContexts, LoggerConfigs 以及 Appenders 使用了MBeans并且可以被远程检测和控制.


使JMX生效

默认情况下JMX是生效的。当log4j初始化的时候StatusLogger, ContextSelector, 以及所有的LoggerContexts, LoggerConfigs 和Appenders 使用了 MBeans. 当启动JVM时如果想禁用掉JMX则需要在系统配置文件中添加 log4j2.disable.jmx=true .

本地监视

本地监视不需要修改任何系统配置文件。使用Java里自带的JConsole工具即可监视你的应用,当安装完JDK之后并配置了环境变量,只需要在终端执行以下命令即可打开可视化的监视界面。

jconsole

远程监视应用

要使远程监视应用有效则需要在启动JVM之前在系统配置文件中添加一下配置.

com.sun.management.jmxremote.port=portNum

其中portNum即指远程应用的端口。

Log4j2 检测组件

下面则是Log4j Mbeans在jconsole里的一段截图.

JMX学习以及在log4j中的应用

可视化客户端

Log4j包含了基本的可视化组件,可以监视 StatusLogger 输出以及远程修改Log4j 配置.该客户端可以被当作单独的应用运行,也可以作为JConsole的插件使用。

当作JConsole插件

使用下面的命令启动jconsole

%JAVA_HOME%\bin\jconsole -pluginpath \path\to\log4j-api-2.1.jar;\path\to\log4j-core-2.1.jar;\path\to\log4j-jmx-gui-2.1.jar

执行完上述命令后你将可以看到下面包含log4j2标签页的界面

JMX学习以及在log4j中的应用

远程编辑log4j配置信息

这个GUI工具也包含了简单的编辑器用于编辑log4j配置信息。如下图所示

JMX学习以及在log4j中的应用


当作独立的应用运行

执行下面的命令

%JAVA_HOME%\bin\java -cp \path\to\log4j-api-2.1.jar;\path\to\log4j-core-2.1.jar;\path\to\log4j-jmx-gui-2.1.jar org.apache.logging.log4j.jmx.gui.ClientGui <options>

上面的options可以为下面三项中的一项

  • <host>:<port>

  • service:jmx:rmi:///jndi/rmi://<host>:<port>/jmxrmi

  • service:jmx:rmi://<host>:<port>/jndi/rmi://<host>:<port>/jmxrmi

此处不得不注意端口号必须与启动应用时所指定的JMX端口号一致

例如在启动应用的时候指定JVM参数信息如下:

com.sun.management.jmxremote.port=33445  com.sun.management.jmxremote.authenticate=false  com.sun.management.jmxremote.ssl=false

紧接着执行下面的命令:

%JAVA_HOME%\bin\java -cp \path\to\log4j-api-2.1.jar;\path\to\log4j-core-2.1.jar;\path\to\log4j-jmx-gui-2.1.jar org.apache.logging.log4j.jmx.gui.ClientGui localhost:33445

下面则是相关的两个示例图片:

JMX学习以及在log4j中的应用

JMX学习以及在log4j中的应用


本文只是进行了简单介绍,使用过程中遇到的问题将在后续进行说明。