1. 思路
使用 spring-jmx、jolokia 将 JMX 封装并暴露 restful 接口,便于操作。
2. logback 实现
2.1. JMXConfiguratorMBean
接口 ch.qos.logback.classic.jmx.JMXConfiguratorMBean 提供了如下操作入口:
|
|
2.2. JMXConfigurator
类 ch.qos.logback.classic.jmx.JMXConfigurator 实现了 JMXConfiguratorMBean。
实例化 JMXConfigurator 并使用 spring-jmx 暴露。
该类构造方法中的 ch.qos.logback.classic.LoggerContext 对象,可通过 (LoggerContext) LoggerFactory.getILoggerFactory() 获取。
3. log4j2 实现
log4j2 中未提供 JMX 操作接口,不过通过查看源码可知:
org.apache.logging.slf4j.Log4jLogger,是slf4j的log4j2桥接实现Log4jLogger是代理的org.apache.logging.log4j.spi.ExtendedLogger具体日志输出功能- 被代理的
ExtendedLogger是通过org.apache.logging.log4j.spi.LoggerContext#getLogger(java.lang.String)实例化的 getLogger是通过在org.apache.logging.log4j.core.LoggerContext#newInstancenew 一个org.apache.logging.log4j.core.Logger的实例org.apache.logging.log4j.core.Logger提供了org.apache.logging.log4j.core.Logger#setLevel方法设置日志级别
因此,只需要使用 spring-jmx 封装一个对象,提供 setLevel 方法,在该方法中,通过 org.apache.logging.log4j.LogManager#getLogger(java.lang.String) 获取到 logger,再调用该 logger 的 setLevel 方法即可;
由于 org.apache.logging.log4j.core.LoggerContext#loggerRegistry 缓存了同名的的 logger,可以保证设置的其他使用的是同一个 logger 实例。