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
下面則是相關的兩個示例圖片:
本文只是進行了簡單介紹,使用過程中遇到的問題將在后續進行說明。