动态修改Log4j2的日志级别
在实际生产环境中,我们一般配置的日志级别为INFO或者WARN级别及以上。当生产环境某项业务忽然出现问题,此时看WARN日志找不出什么线索,最好能在不重启服务器的情况下,将WARN级别改为DEBUG级别,查看更多的日志来判断情况。
这就需要能够动态调整Log4j2的日志级别
JMX方式
Log4j2官方提供了对JMX的支持,可以很方便的进行配置的修改
操作步骤
-
启动应用
-
启动JConsole,并点击MBean一栏
-
找到log4j2的MBean,通过getConfigText获取此时的配置
-
此时访问应用,日志会打印出INFO级别的日志,说明此时应用默认级别为INFO
INFO com.example.log4j2.controller.LogController - Info level log message WARN com.example.log4j2.controller.LogController - Warn level log message ERROR com.example.log4j2.controller.LogController - Error level log message
-
修改特定Logger的日志级别,我们这里将com.example.log4j2.controller.LogController 这个Logger的日志级别改为DEBUG级别
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %level %logger - %msg%n"/> </Console> <RollingFile name="MyFile" fileName="logs/app.log" immediateFlush="true" filePattern="logs/$${date:yyyy-MM-dd}/app-%d{yyyy-MM-dd}-%i.log.gz"> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> <JsonTemplateLayout eventTemplateUri="classpath:EcsLayout.json"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size = "10KB"/> </Policies> <DefaultRolloverStrategy fileIndex="nomax"/> </RollingFile> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> <Logger name="com.example.log4j2.controller" level="debug" > <AppenderRef ref="MyFile"/> </Logger> </Loggers> </Configuration>
-
通过JConsole调用setConfigText方法
-
再访问应用,发现已经把DEBUG级别的日志打印出来了
DEBUG com.example.log4j2.controller.LogController - Debug level log message INFO com.example.log4j2.controller.LogController - Info level log message WARN com.example.log4j2.controller.LogController - Warn level log message ERROR com.example.log4j2.controller.LogController - Error level log message
-
也可以通过上述步骤的getConfigText方法再次验证返回的内容是不是刚刚修改过的内容
编程式+页面方式
我们可以使用编程式方式,通过页面调用HTTP接口,从而实现具体Logger的级别的调整,以下代码来自于官方文档
// org.apache.logging.log4j.core.config.Configurator;
Configurator.setLevel("com.example.Foo", Level.DEBUG);
// You can also set the root logger:
Configurator.setRootLevel(Level.DEBUG);
两种方式的比较
如果只是调整logger的级别,并且对Devops友好,建议使用编程式;如果是想要动态修改其他配置,建议使用JMX。
其他资源
- 如果对JMX不熟悉的同学,可以参考JMX快速入门这篇文章