跳到主要内容
JackSparrow414
返回

Log4j2的使用(二)动态修改日志级别

本文导航

展开本文导航

动态修改Log4j2的日志级别

在实际生产环境中,我们一般配置的日志级别为INFO或者WARN级别及以上。当生产环境某项业务忽然出现问题,此时看WARN日志找不出什么线索,最好能在不重启服务器的情况下,将WARN级别改为DEBUG级别,查看更多的日志来判断情况。

这就需要能够动态调整Log4j2的日志级别

JMX方式

Log4j2官方提供了对JMX的支持,可以很方便的进行配置的修改

操作步骤

  1. 启动应用

  2. 启动JConsole,并点击MBean一栏

  3. 找到log4j2的MBean,通过getConfigText获取此时的配置 JConsole 调用 Log4j2 MBean 的 getConfigText 获取日志配置

  4. 此时访问应用,日志会打印出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
  5. 修改特定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>
  6. 通过JConsole调用setConfigText方法 JConsole 中 Log4j2 MBean 的 setConfigText 操作入口

  7. 再访问应用,发现已经把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
  8. 也可以通过上述步骤的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);

关于此方式stackoverflow更详细的介绍

两种方式的比较

如果只是调整logger的级别,并且对Devops友好,建议使用编程式;如果是想要动态修改其他配置,建议使用JMX。

其他资源


分享本文:

继续阅读本系列

Log4j2 的理解与使用

  1. Log4j2的理解与使用(一)
  2. Log4j2的使用(二)动态修改日志级别正在阅读
  3. Log4j2的使用(三)不同的环境使用不同的配置

评论

欢迎提问、纠错和分享经验。发表评论需要登录 GitHub;中英文版本共享评论。

评论仅在正式网站开放。