JMX

Log4j 2 具有对 JMX 的内置支持。 StatusLogger,ContextSelector 以及所有 LoggerContext,LoggerConfigs 和 Appender 均使用 MBean 进行检测,并且可以进行远程监视和控制。

还包括一个简单的 Client 端 GUI,可用于监视 StatusLogger 输出,以及使用其他配置文件远程重新配置 Log4j,或直接编辑当前配置。

Enabling JMX

默认情况下,JMX 支持处于启用状态。 Log4j 初始化时,将使用 MBean 检测 StatusLogger,ContextSelector 以及所有 LoggerContext,LoggerConfig 和 Appender。要完全禁用 JMX 并阻止创建这些 MBean,请在启动 Java VM 时将系统属性 log4j2.disableJmx 指定为 true。

本地监视和 Management

要执行本地监视,您无需指定任何系统属性。 Java JDK 中包含的 JConsole 工具可用于监视您的应用程序。通过在命令 Shell 中键入$ JAVA_HOME/bin/jconsole 来启动 JConsole。有关更多详细信息,请参见如何使用 JConsole上的 Oracle 文档。

远程监视和 Management

要从远程系统启用监视和 Management,请在启动 Java VM 时设置以下系统属性。

com.sun.management.jmxremote.port=portNum

在上面的属性中,portNum 是要用来启用 JMX RMI 连接的端口号。

有关更多详细信息,请参见远程监控与 Management上的 Oracle 文档。

RMI 对垃圾回收的影响

请注意,默认情况下,RMI 每小时触发一次完整的 GC。有关 sun.rmi.dgc.server.gcInterval 和 sun.rmi.dgc.client.gcInterval 属性的信息,请参见Oracle documentation。这两个属性的默认值为 3600000 毫秒(一小时)。在 Java 6 之前是一分钟。

两个 sun.rmi 参数反映了您的 JVM 是在服务器模式还是在 Client 端模式下运行。如果要修改 GC 间隔时间,最好同时指定两个属性,以确保 JVM 接受该参数。

另一种选择是禁用与-XX 一起的对 System.gc()的显式调用:DisableExplicitGC,或者(如果使用 CMS 或 G1 收集器)添加-XX:ExplicitGCInvokesConcurrent 以确保完整的 GC 与您的并行并行完成应用程序,而不是强制停止收集。

Log4j 检测组件

找出通过 JMX 可访问各种 Log4j 组件的哪些方法和属性的最佳方法是查看Javadoc或直接在 JConsole 中进行探索。

下面的屏幕快照显示了 JConsole 中的 Log4j MBean。

MBeans 选项卡的 JConsole 屏幕截图

Client GUI

Log4j 包括一个基本的 Client 端 GUI,可用于监视 StatusLogger 输出和远程修改 Log4j 配置。Client 端 GUI 可以作为独立应用程序或 JConsole 插件运行。

将 Client 端 GUI 作为 JConsole 插件运行

要将 Log4j JMXClient 端 GUI 作为 JConsole 插件运行,请使用以下命令启动 JConsole:

$ JAVA_HOME/bin/jconsole -pluginpath /path/to/log4j-api-2.13.3.jar:/path/to/log4j-core-2.13.3.jar:/path/to/log4j-jmx-gui-2.13 3.jar

或在 Windows 上:

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

如果执行上述命令并连接到应用程序,则在 JConsole 窗口中将看到一个额外的“ Log4j 2”选项卡。此选项卡包含 Client 端 GUI,并且已选择 StatusLogger。下面的屏幕快照显示了 JConsole 中的 StatusLogger 面板。

JConsole StatusLogger 显示的屏幕截图

远程编辑 Log4j 配置

Client 端 GUI 还包含一个简单的编辑器,可用于远程更改 Log4j 配置。

下面的屏幕快照显示了 JConsole 中的配置编辑面板。

JConsole 配置文件编辑器的屏幕快照

配置编辑面板提供了两种修改 Log4j 配置的方法:指定其他配置位置 URI,或直接在编辑器面板中修改配置 XML。

如果您指定其他配置位置 URI,然后单击“从位置重新配置”按钮,则指定的文件或资源必须存在并且可由应用程序读取,否则将发生错误并且配置不会更改。如果在处理指定资源的内容时发生错误,Log4j 将保留其原始配置,但编辑器面板将显示您指定文件的内容。

显示配置文件内容的文本区域是可编辑的,您可以在此编辑器面板中直接修改配置。单击“使用下面的 XML 重新配置”按钮,会将配置文本发送到远程应用程序,在该应用程序中它将用于动态重新配置 Log4j。这不会覆盖任何配置文件。使用编辑器中的文本重新配置仅发生在内存中,并且文本不会永久存储在任何地方。

将 Client 端 GUI 作为独立应用程序运行

要将 Log4j JMXClient 端 GUI 作为独立应用程序运行,请运行以下命令:

$ JAVA_HOME/bin/java -cp /path/to/log4j-api-2.13.3.jar:/path/to/log4j-core-2.13.3.jar:/path/to/log4j-jmx-gui-2.13 .3.jar org.apache.logging.log4j.jmx.gui.ClientGui<options>

或在 Windows 上:

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

其中选项为以下之一:

  • <host>:<port>

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

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

端口号必须与启动要监视的应用程序时指定的 portNum 相同。

例如,如果使用以下选项启动了应用程序:

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

(请注意,这会禁用所有安全性,因此不建议在生产环境中使用.Oracle 在远程监控与 Management上的文档提供了有关如何使用密码身份验证和 SSL 更安全地配置 JMX 的详细信息.)

然后,您可以使用以下命令运行 Client 端:

$ JAVA_HOME/bin/java -cp /path/to/log4j-api-2.13.3.jar:/path/to/log4j-core-2.13.3.jar:/path/to/log4j-jmx-gui-2.13 3..3.jar org.apache.logging.log4j.jmx.gui.ClientGui localhost:33445

或在 Windows 上:

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

下面的屏幕快照显示了作为独立应用程序运行时 Client 端 GUI 的 StatusLogger 面板。

StatusLogger 显示的 JMX GUI 屏幕截图

下面的屏幕快照显示了作为独立应用程序运行时 Client 端 GUI 的配置编辑器面板。

配置编辑器的 JMX GUI 屏幕截图