JMX学习以及在log4j中的应用
前言
JMX即Java Managemen Extensions,是一个为应用程序植入管理功能的框架。一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。
常常在编程的过程中有一些配置信息需要动态的进行改变,我以往会有如下几种做法:
-
写死在Java code中,环境发生变化的时候修改Java code
-
写在名为*.properties的配置文件里,使用Java读取配置文件
然而今天我们将引入一种高级的方式来进行配置信息的管理,那便是JMX的引入。
如何使用JMX
JMX做为一份规范,JDK中提供了JMX接口,因此安装了JDK后就可以开发基于JMX的代码了。
JMX具有两层结构,各层的组件如下
工具层
-
Mbeans
-
通知模型:Notification、NotificationListener
-
Mbeans与数据类:Attribute、Operator
代理层
-
MBean Server
-
代理服务
下面学习下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里的一段截图.
可视化客户端
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标签页的界面
远程编辑log4j配置信息
这个GUI工具也包含了简单的编辑器用于编辑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
下面则是相关的两个示例图片:
本文只是进行了简单介绍,使用过程中遇到的问题将在后续进行说明。