1. 程式人生 > >SpringBoot使用logback實現日誌按天滾動

SpringBoot使用logback實現日誌按天滾動

需求
  1. 日誌按天滾動分割
  2. info和error日誌輸出到不同檔案
為什麼使用Logback

在這裡,我不去深究的討論各個日誌框架的優劣,網上的對比文章實在太多了。我只說以下幾點理由。

  1. Logback是Log4j的升級版,作者為同一個人,作者不想再去改Log4j,所以寫了Logbak
  2. 使用日誌框架的最佳實踐是選擇一款日誌門面+一款日誌實現,這裡選擇Slf4j+Logback, Slf4j作者也是Logbak的作者
  3. SpringBoot從1.4版本開始,內建的日誌框架就是Logback
Logback在SpringBoot中配置方式一

可以直接在applicatin.properties或者application.yml中配置
以在application.yml中配置為例:

logging: 
  pattern: 
    console: "%d - %msg%n" 
  file: /var/log/tomcat/sell.log 
  level: com.imooc.LoggerTest: debug

可以發現,這種配置方式簡單,但能實現的功能也很侷限,只能

  • 定製輸出格式
  • 輸出檔案的路徑
  • 指定某個包下的日誌級別

如果需要完成我們的需求,這就得用第二種配置了

Logback在SpringBoot中配置方式二

在resource目錄下新建logback-spring.xml, 內容如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d - %msg%n</pattern>
        </layout>
    </appender>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
        <!--滾動策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路徑-->
            <fileNamePattern>/var/log/tomcat/sell/info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
        <!--滾動策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路徑-->
            <fileNamePattern>/var/log/tomcat/sell/error.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>
    <root level="info">
        <appender-ref ref="consoleLog" />
        <appender-ref ref="fileInfoLog" />
        <appender-ref ref="fileErrorLog" />
    </root>
</configuration>

每一個appender你可以理解為一個日誌處理策略。
第一個appender的name="consoleLog", 名字是自己隨意取的,取這個名字,表示這個策略用於控制檯的日誌。
我們重點看第二個和第三個appender

  1. 因為要把info和error日誌輸入到不同檔案, 所以我們分別建了兩個appender。
  2. rollingPolicy是滾動策略,這裡我們設定按時間滾動
  3. filter是日誌的過濾方式,我們在fileInfoLog裡做了如下過濾

<?xml version="1.0"?>
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
上述程式碼翻譯之後:攔截ERROR級別的日誌。如果匹配到了,則禁用處理。如果不匹配,則接受,開始處理日誌。
那有的同學要問了,不能這樣寫嗎
<level>INFO</level>
這樣不是隻攔截INFO日誌了嗎?
不對!
這就得說一下日誌級別了
DEBUG ->INFO -> WARN ->ERROR
如果你設定的日誌級別是INFO,那麼是會攔截ERROR日誌的哦。