1. 程式人生 > >通過jmx動態修改logback的日誌級別

通過jmx動態修改logback的日誌級別

應用上線後常常會面對這樣一種困境,即,如果把日誌級別開得太高,那麼當系統出現問題時不好查,如果把日誌級別定得太低,那麼硬碟很可能很快就被撐爆了。
這時候我們常常選擇先將日誌級別定高點,當出現問題時,再調低。大部分時候人們習慣的做法是修改logback.xml配置檔案,然後重啟應用。
這聽起來當然有問題,我應用跑得好好的,使用者用著好好的,為什麼要重啟呢,誰來應對重啟時客戶的怒火呢?

logback的開發者想得周到啦,他們為使用者提供了一種動態修改日誌級別的能力,而不需要你重啟應用。下面的內容僅作為一次簡單嘗試:

  1. 修改logback.xml檔案

    ...
    <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. 啟動應用,觀察日誌

    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. 觀察日誌

    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日誌又消失了。