On this page
第 10 章:JMX Configurator
顾名思义,JMXConfigurator
允许通过 JMX 配置回发。简而言之,它使您可以从默认配置文件,指定文件或 URL 重新配置logback,列出 Logger 并修改 Logger 级别。
使用 JMX 配置器
如果您的服务器在 JDK 1.6 或更高版本上运行,则只需在命令行上调用jconsole
应用程序,然后连接到服务器的 MBeanServer。如果运行的是较早的 JVM,则应阅读JMX 启用服务器上的内容。
JMXConfigurator
由您的logback配置文件中的一行启用,如下所示:
<configuration>
<jmxConfigurator />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{25} - %msg%n</Pattern>
</layout>
</appender>
<root level="debug">
<appender-ref ref="console" />
</root>
</configuration>
使用* jconsole *连接到服务器后,在 MBeans 面板上的“ ch.qos.logback.classic.jmx.Configurator”文件夹下,您应该看到几个操作可供选择,如下图所示:
在 jconsole 中查看的 JMXConfigurator 屏幕截图
因此,您可以
使用默认配置文件重新加载回发配置。
使用指定的 URL 重新加载配置。
用指定的文件重新加载配置。
设置指定 Logger 的级别。要设置为 null,请将字符串“ null”作为值传递。
获取指定 Logger 的级别。返回的值可以为 null。
获取指定 Logger 的effective level。
JMXConfigurator
将现有 Logger 的列表和状态列表作为属性公开。
状态列表可以帮助您诊断回发的内部状态。
避免内存泄漏
如果您的应用程序部署在 Web 服务器或应用程序服务器中,则JMXConfigurator
实例的注册会创建一个从系统类加载器到您应用程序的引用,这将防止在停止或重新部署该应用程序时对其进行垃圾回收,从而导致在严重的内存泄漏中。
因此,除非您的应用程序是独立的 Java 应用程序,否则您必须从 JVM 的 Mbeans 服务器中注销JMXConfigurator
实例。调用适当的LoggerContext
的reset
()方法将自动注销任何 JMXConfigurator 实例。重置 logger 上下文的一个好地方是javax.servlet.ServletContextListener
的contextDestroyed
()方法。这是示例代码:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
public class MyContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent sce) {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
lc.stop();
}
public void contextInitialized(ServletContextEvent sce) {
}
}
具有多个 Web 应用程序的 JMXConfigurator
如果您在同一服务器上部署多个 Web 应用程序,并且尚未覆盖默认的context selector,并且在* WEB-下将* logback-*。jar 和 slf4j-api.jar 的副本放置在每个 Web 应用程序的 INF/lib *文件夹,然后默认情况下,每个JMXConfigurator
实例将以相同的名称注册,即“ ch.qos.logback.classic:Name = default,Type = ch.qos.logback.classic .jmx.JMXConfigurator”。换句话说,默认情况下,与每个 Web 应用程序中的 logger 上下文相关联的各种JMXConfigurator
实例将发生冲突。
为避免此类意外冲突,您只需设置应用程序的日志上下文的名称和JMXConfigurator
就会自动使用您设置的名称。
例如,如果您部署两个名为“ Koala”和“ Wombat”的 Web 应用程序,那么您将使用 Koala 的 logback 配置进行编写
<configuration>
<contextName>Koala</contextName>
<jmxConfigurator/>
...
<configuration>
在 Wombat logback 配置文件中,您将编写:
<configuration>
<contextName>Wombat</contextName>x
<jmxConfigurator/>
...
<configuration>
在 jconsole 的 MBeans 面板中,您将看到两个不同的JMXConfigurator
实例:
您可以借助<jmxConfigurator>
元素的“ objectName”属性完全控制在 MBeans 服务器上注册 JMXConfigurator 的名称。
JMX 启用您的服务器
如果您的服务器运行 JDK 1.6 或更高版本,则默认情况下应启用 JMX。
对于较早的 JVM,建议您参考 Web 服务器的 JMX 相关文档。此类文档适用于Tomcat和Jetty。在本文档中,我们简要描述了 Tomcat 和 Jetty 所需的配置步骤。
在 Jetty 中启用 JMX(已在 JDK 1.5 和 JDK 1.6 下测试)
以下已在 JDK 1.5 和 1.6 下进行了测试。在 JDK 1.6 和更高版本中,服务器默认情况下启用 JMX,您可以但不必遵循以下步骤。在 JDK 1.5 下,要在 Jetty 中添加 JMX 支持,需要在* $ JETTY_HOME/etc/jetty.xml *配置文件中添加许多内容。以下是需要添加的元素:
<Call id="MBeanServer" class="java.lang.management.ManagementFactory"
name="getPlatformMBeanServer"/>
<Get id="Container" name="container">
<Call name="addEventListener">
<Arg>
<New class="org.mortbay.management.MBeanContainer">
<Arg><Ref id="MBeanServer"/></Arg>
<Call name="start" />
</New>
</Arg>
</Call>
</Get>
如果希望通过jconsole
应用程序访问 Jetty 公开的 MBean,则需要在设置 Java 系统属性“ com.sun.management.jmxremote”之后启动 Jetty。
对于 Jetty 的独立版本,它转换为:
java -Dcom.sun.management.jmxremote -jar start.jar [配置文件]
并且,如果您希望将 Jetty 作为 Maven 插件启动,则需要通过MAVEN_OPTS
shell 变量设置“ com.sun.management.jmxremote”系统属性:
MAVEN_OPTS =“-Dcom.sun.management.jmxremote ” mvn jetty:run
然后,您可以通过jconsole
访问 Jetty 以及logback的JMXConfigurator
所访问的 MBean。
构建连接后,您应该可以访问JMXXConfigurator
,如上面的screenshot所示。
带有 Jetty 的 MX4J(已在 JDK 1.5 和 1.6 下测试)
如果您希望通过 MX4J 的 HTTP 接口访问JMXConfigurator
并假设您已经下载MX4J,则需要通过添加设置 Management 端口的指令来修改前面讨论的 Jetty 配置文件。
<Call id="MBeanServer"
class="java.lang.management.ManagementFactory"
name="getPlatformMBeanServer"/>
<Get id="Container" name="container">
<Call name="addEventListener">
<Arg>
<New class="org.mortbay.management.MBeanContainer">
<Arg><Ref id="MBeanServer"/></Arg>
<Set name="managementPort">8082</Set>
<Call name="start" />
</New>
</Arg>
</Call>
</Get>
此外,需要将* mx4j-tools.jar *添加到 Jetty 的 Classpath 中。
如果您将 Jetty 作为 Maven 插件运行,则需要添加* mx4j-tools *作为依赖项。
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<configuration>
<jettyConfig>path/to/jetty.xml</jettyConfig>
...
</configuration>
<dependencies>
<dependency>
<groupId>mx4j</groupId>
<artifactId>mx4j-tools</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
</plugin>
使用以上配置启动 Jetty 后,可以在以下 URL 上找到JMXConfigurator
(搜索“ ch.qos.logback.classic”):
下面是 MX4J 界面的屏幕截图。
为 Tomcat 配置 JMX(在 JDK 1.5 和 1.6 下测试)
如果您使用的是 JDK 1.6 及更高版本,则默认情况下您的服务器已启用 JMX,您可以但不必遵循以下步骤。在 JDK 1.5 下,Tomcat 需要在* $ TOMCAT_HOME/bin/catalina.bat/sh * Shell 脚本中添加以下几行:
CATALINA_OPTS="-Dcom.sun.management.jmxremote"
使用这些选项启动后,通过在 shell 中发出以下命令,可以使用jconsole
访问 Tomcat 公开的 MBean 以及logback的JMXConfigurator
:
jconsole
构建连接后,您应该可以访问JMXXConfigurator
,如上面的screenshot所示。
带有 Tomcat 的 MX4J(在 JDK 1.5 和 1.6 下测试)
您可能希望通过 MX4J 提供的基于 Web 的界面访问 JMX 组件。在这种情况下,以下是必需的步骤:
假设您已经下载了MX4J,请将* mx4j-tools.jar 文件放在 $ TOMCAT_HOME/bin/目录下。然后,将以下行添加到 $ TOMCAT_HOME/bin/catalina.sh *配置文件中:
\ at the beginning of the file CATALINA_OPTS =“-Dcom.sun.management.jmxremote”<!-- in the "Add on extra jar files to CLASSPATH" section --> CLASSPATH =“ $ CLASSPATH”:“ $ CATALINA_HOME” /bin/mx4j-tools.jar
最后,在* $ TOMCAT_HOME/conf/server.xml *文件中声明一个新的Connector
:
<Connector port="0"
handler.list="mx"
mx.enabled="true"
mx.httpHost="localhost"
mx.httpPort="8082"
protocol="AJP/1.3" />
Tomcat 启动后,应该可以通过将浏览器指向以下 URL(搜索“ ch.qos.logback.classic”)来找到 JMXConfigurator:
下面是 MX4J 界面的屏幕截图。