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.gcInterval
和 sun.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。
客户端 GUI
Apache Log4j JMX GUI 是一个基本的客户端 GUI,可用于监控 StatusLogger
输出并远程修改 Log4j 配置。客户端 GUI 可以作为独立应用程序或 JConsole 插件运行。