发布于 

通过jmx动态修改logback的日志级别

应用上线后常常会面对这样一种困境,即,如果把日志级别开得太高,那么当系统出现问题时不好查,如果把日志级别定得太低,那么硬盘很可能很快就被撑爆了。
这时候我们常常选择先将日志级别定高点,当出现问题时,再调低。大部分时候人们习惯的做法是修改logback.xml配置文件,然后重启应用。
这听起来当然有问题,我应用跑得好好的,用户用着好好的,为什么要重启呢,谁来应对重启时客户的怒火呢?

logback的开发者想得周到啦,他们为用户提供了一种动态修改日志级别的能力,而不需要你重启应用。下面的内容仅作为一次简单尝试:

  1. 修改logback.xml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    <jmxConfigurator/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
    <pattern>%d{yyyy-MM-dd HH:mm:ss} %level [%thread] [%class:%line] - %m%n</pattern>
    </encoder>
    </appender>
    ...

    实际上我们只是新增了一行<jmxConfigurator/>

  2. 启动应用,观察日志

    1
    2
    3
    4
    5
      2018-04-02 19:23:50 INFO [metrics-logger-reporter-thread-1] [com.codahale.metrics.Slf4jReporter:214] - ....
    2018-04-02 19:23:50 INFO [metrics-logger-reporter-thread-1] [com.codahale.metrics.Slf4jReporter:183] - ...
    2018-04-02 19:24:00 INFO [qbScheduler-4] [com.gzcb.creditcard.fdp.utils.ReturnFileTasksScheduler:34] - 定时扫描返回文件开始执行...
    2018-04-02 19:24:00 INFO [qbScheduler-4] [com.gzcb.creditcard.fdp.utils.ReturnFileTasksScheduler:37] - 当前Web节点不是master,跳过...
    ...
  3. 启动jconsole, 连接应用,选择MBean

  4. 找到ch.qos.logback.classic.default目录下的类ch.qos.logback.classic.jmx.JMXConfigurator

  5. 选择操作,选择setLoggerLevel,输入参数,第一个是loggerName,第二个是loggerLevel,点击按钮
    jconsole

  6. 观察日志

    1
    2
    3
    4
    5
    6
    7
    2018-04-02 19:30:27 DEBUG [DefaultQuartzScheduler_QuartzSchedulerThread] [org.quartz.core.QuartzSchedulerThread:276] - ...
    2018-04-02 19:30:50 INFO [metrics-logger-reporter-thread-1] [com.codahale.metrics.Slf4jReporter:214] - ...
    2018-04-02 19:30:50 INFO [metrics-logger-reporter-thread-1] [com.codahale.metrics.Slf4jReporter:183] - ...
    2018-04-02 19:30:56 DEBUG [DefaultQuartzScheduler_QuartzSchedulerThread] [org.quartz.core.QuartzSchedulerThread:276] - ...
    2018-04-02 19:31:00 INFO [qbScheduler-4] [com.gzcb.creditcard.fdp.utils.ReturnFileTasksScheduler:34] - ...
    2018-04-02 19:31:00 INFO [qbScheduler-4] [com.gzcb.creditcard.fdp.utils.ReturnFileTasksScheduler:37] - ...
    2018-04-02 19:31:22 DEBUG [DefaultQuartzScheduler_QuartzSchedulerThread] [org.quartz.core.QuartzSchedulerThread:276] - ...

    我们发现本来全是info的日志,突然变成有debug级别输出了。如果再次修改loggerLevel为info,debug日志又消失了。

    基础乞丐版应用就是这么简单,请自行尝试。如果想获取更多内容,自行访问https://logback.qos.ch/manual/jmxConfig.html