JMX

Log4j 2 内置支持 JMX。StatusLogger、ContextSelector 和所有 LoggerContexts、LoggerConfigs 和 Appenders 都使用 MBeans 进行检测,可以远程监控和控制。

还包含一个简单的客户端 GUI,可用于监控 StatusLogger 输出,以及远程使用不同的配置文件重新配置 Log4j,或直接编辑当前配置。

启用 JMX

默认情况下启用 JMX 支持。当 Log4j 初始化时,StatusLogger、ContextSelector 和所有 LoggerContexts、LoggerConfigs 和 Appenders 都使用 MBeans 进行检测。要完全禁用 JMX 并阻止创建这些 MBeans,请在启动 Java VM 时将系统属性 log4j2.disableJmx 指定为 true

本地监控和管理

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

远程监控和管理

要启用来自远程系统的监控和管理,请在启动 Java VM 时设置以下系统属性。

com.sun.management.jmxremote.port=portNum

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

有关更多详细信息,请参阅 Oracle 关于 远程监控和管理 的文档。

RMI 对垃圾回收的影响

请注意,RMI 默认情况下每小时触发一次完全 GC。请参阅 Oracle 文档 中的 sun.rmi.dgc.server.gcIntervalsun.rmi.dgc.client.gcInterval 属性。这两个属性的默认值均为 3600000 毫秒(一小时)。在 Java 6 之前,它是一分钟。

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

另一种方法可能是使用 -XX:+DisableExplicitGC 完全禁用对 System.gc() 的显式调用,或者(如果您使用的是 CMS 或 G1 收集器)添加 -XX:+ExplicitGCInvokesConcurrent 以确保完全 GC 与您的应用程序并行并发执行,而不是强制执行停止世界收集。

Log4j 检测到的组件

查找各种 Log4j 组件的哪些方法和属性可通过 JMX 访问的最佳方法是查看 log4j-core 工件中的 org.apache.logging.log4j.core.jmx 包内容,或直接在 JConsole 中进行探索。

下面的屏幕截图显示了 JConsole 中的 Log4j MBeans。

JConsole screenshot of the MBeans tab

客户端 GUI

Apache Log4j JMX GUI 是一个基本的客户端 GUI,可用于监控 StatusLogger 输出并远程修改 Log4j 配置。客户端 GUI 可以作为独立应用程序或 JConsole 插件运行。