Spring Boot 2.X(十四):日誌功能 Logback

  • 2019 年 11 月 4 日
  • 筆記

Logback 簡介

Logback 是由 SLF4J 作者開發的新一代日誌框架,用於替代 log4j。

主要特點是效率更高,架構設計夠通用,適用於不同的環境。

Logback 分為三個模組:logback-core,logback-classic和logback-access。

logback-core 模組是其他兩個模組的基礎。

logback-classic 模組是 core 的擴展,是log4j的改進版。logback-classic 本身實現了 SLF4J API,因此可以很容易的在 logback 和其他日誌框架之間來回切換,例如 log4j、java.util.logging(JUL)。

logback-access 模組集成了 Servlet 容器,提供了 HTTP 訪問日誌的功能。

官網:http://logback.qos.ch

中文網:http://www.logback.cn

github:https://github.com/qos-ch/logback

Logback 使用

1.使用 logback-spring.xml 配置

<?xml version="1.0" encoding="UTF-8"?>  <!-- 日誌級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置為WARN,則低於WARN的資訊都不會輸出 -->  <!-- scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新載入,默認值為true。 -->  <!-- scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。 -->  <!-- debug:當此屬性設置為true時,將列印出logback內部日誌資訊,實時查看logback運行狀態。默認值為false。 -->  <configuration scan="true" scanPeriod="60 seconds" debug="false">      <!-- 定義日誌根目錄 -->      <property name="LOG_PATH" value="/usr/local/log/" />      <!-- 定義應用名稱 -->      <property name="APP_NAME" value="springboot-logback" />      <!-- 應用名稱 -->      <contextName>${APP_NAME}</contextName>      <!-- 引用 Spring Boot 中默認的 logback 配置 -->      <!-- <include resource="org/springframework/boot/logging/logback/base.xml" /> -->      <!-- 可以動態修改日誌輸出等級 -->      <jmxConfigurator />         <!--輸出到控制台-->      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">          <!--此日誌appender是為開發使用,只配置最底級別,控制台輸出的日誌級別是大於或等於此級別的日誌資訊-->          <filter class="ch.qos.logback.classic.filter.ThresholdFilter">              <level>debug</level>          </filter>          <encoder>              <pattern>%d [%t] %5p %c:%L - %m%n</pattern>              <!-- 設置字符集 -->              <charset>UTF-8</charset>          </encoder>      </appender>      <!-- 時間滾動輸出 level為 INFO 日誌 -->      <appender name="INFO_FILE"          class="ch.qos.logback.core.rolling.RollingFileAppender">          <File>${LOG_PATH}${APP_NAME}-info.log</File>          <encoder>              <pattern>%d [%t] %5p %c:%L - %m%n</pattern>          </encoder>          <!-- 日誌記錄器的滾動策略,按日期,按大小記錄,日誌按天分類壓縮保存-->          <rollingPolicy              class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">              <timeBasedFileNamingAndTriggeringPolicy                  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">                  <maxFileSize>100MB</maxFileSize>              </timeBasedFileNamingAndTriggeringPolicy>              <FileNamePattern>${LOG_PATH}${APP_NAME}/info/%d{yyyy-MM-dd}-%i.log.gz              </FileNamePattern>               <!--日誌文件保留天數-->              <MaxHistory>30</MaxHistory>          </rollingPolicy>      </appender>      <!-- 時間滾動輸出 level為 ERROR 日誌 -->      <appender name="ERROR_FILE"          class="ch.qos.logback.core.rolling.RollingFileAppender">          <File>${LOG_PATH}${APP_NAME}-error.log</File>          <filter class="ch.qos.logback.classic.filter.ThresholdFilter">              <level>error</level>          </filter>          <encoder>              <pattern>%d [%t] %5p %c:%L - %m%n</pattern>          </encoder>          <!-- 日誌記錄器的滾動策略,按日期,按大小記錄,日誌按天分類壓縮保存-->          <rollingPolicy              class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">              <timeBasedFileNamingAndTriggeringPolicy                  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">                  <maxFileSize>256MB</maxFileSize>              </timeBasedFileNamingAndTriggeringPolicy>              <FileNamePattern>${LOG_PATH}${APP_NAME}/error/%d{yyyy-MM-dd}-%i.log.gz              </FileNamePattern>               <!--日誌文件保留天數-->              <MaxHistory>30</MaxHistory>          </rollingPolicy>      </appender>      <!-- 設置需要列印日誌的包及輸出級別 -->      <logger name="org.springframework.web" level="INFO" />      <logger name="cn.zwqh.springboot.controller" level="TRACE" />      <!--          使用mybatis的時候,sql語句只有在 debug 級別下才會列印       -->      <logger name="cn.zwqh.springboot.dao" level="debug" />        <!--          root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性          level:用來設置列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,          不能設置為INHERITED或者同義詞NULL。默認是DEBUG          可以包含零個或多個元素,標識這個appender將會添加到這個logger。      -->      <root level="info">          <appender-ref ref="CONSOLE" />          <appender-ref ref="INFO_FILE" />          <appender-ref ref="ERROR_FILE" />      </root>  </configuration>    

2.使用 logback.groovy 配置

使用 groovy 配置需要添加依賴

 <dependency>              <groupId>org.codehaus.groovy</groupId>              <artifactId>groovy-all</artifactId>              <version>2.4.17</version>          </dependency>
import ch.qos.logback.classic.encoder.PatternLayoutEncoder  import ch.qos.logback.classic.filter.ThresholdFilter  import ch.qos.logback.core.ConsoleAppender  import ch.qos.logback.core.rolling.RollingFileAppender  import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP  import ch.qos.logback.core.rolling.TimeBasedRollingPolicy  import java.nio.charset.Charset    import static ch.qos.logback.classic.Level.DEBUG  import static ch.qos.logback.classic.Level.ERROR  import static ch.qos.logback.classic.Level.INFO  import static ch.qos.logback.classic.Level.TRACE    scan("60 seconds")  def LOG_PATH = "/usr/local/log/"  def APP_NAME = "springboot-logback"  context.name = "${APP_NAME}"  jmxConfigurator()  appender("CONSOLE", ConsoleAppender) {    filter(ThresholdFilter) {      level = DEBUG    }    encoder(PatternLayoutEncoder) {      pattern = "%d [%t] %5p %c:%L - %m%n"      charset = Charset.forName("UTF-8")    }  }  appender("INFO_FILE", RollingFileAppender) {    file = "${LOG_PATH}${APP_NAME}-info.log"    encoder(PatternLayoutEncoder) {      pattern = "%d [%t] %5p %c:%L - %m%n"      charset = Charset.forName("UTF-8")    }    rollingPolicy(TimeBasedRollingPolicy) {      timeBasedFileNamingAndTriggeringPolicy(SizeAndTimeBasedFNATP) {        maxFileSize = "100MB"      }      fileNamePattern = "${LOG_PATH}${APP_NAME}/info/%d{yyyy-MM-dd}-%i.log.gz"      maxHistory = 30    }  }  appender("ERROR_FILE", RollingFileAppender) {    file = "${LOG_PATH}${APP_NAME}-error.log"    filter(ThresholdFilter) {      level = ERROR    }    encoder(PatternLayoutEncoder) {      pattern = "%d [%t] %5p %c:%L - %m%n"      charset = Charset.forName("UTF-8")    }    rollingPolicy(TimeBasedRollingPolicy) {      timeBasedFileNamingAndTriggeringPolicy(SizeAndTimeBasedFNATP) {        maxFileSize = "256MB"      }      fileNamePattern = "${LOG_PATH}${APP_NAME}/error/%d{yyyy-MM-dd}-%i.log.gz"      maxHistory = 30    }  }  logger("org.springframework.web", INFO)  logger("cn.zwqh.springboot.controller", TRACE)  logger("cn.zwqh.springboot.dao", DEBUG)  root(INFO, ["CONSOLE", "INFO_FILE", "ERROR_FILE"])

詳細的 logback.groovy 語法可以參考 http://logback.qos.ch/manual/groovy.html 。logback 也提供了 logback.xml 轉 logback.groovy 的在線工具,地址:http://logback.qos.ch/translator/asGroovy.html (include 標籤未作解析,所以轉換前把該標籤去除,否則會報錯)

logback.xml 配置說明

configuration

配置文件的根節點,主要包含以下三個屬性:

  • scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新載入,默認值為true。
  • scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。
  • debug:當此屬性設置為true時,將列印出logback內部日誌資訊,實時查看logback運行狀態。默認值為false。

contextName

設置日誌上下文名稱,後面輸出格式中可以通過定義 %contextName 來列印日誌上下文名稱。

property

配置文件的變數定義,name 代表變數的名稱,value 代表變數定義的值。通過定義的值會被插入到logger上下文中。定義變數後,可以使「${name}」來使用變數。

jmxConfigurator

開啟 JMX 的功能,可以從默認配置文件,指定文件或URL重新配置登錄,列出記錄器並修改記錄器級別。

JMX(Java Management Extensions,即 Java 管理擴展)是一個為應用程式、設備、系統等植入管理功能的框架。JMX 可以跨越一系列異構作業系統平台、系統體系結構和網路傳輸協議,靈活的開發無縫集成的系統、網路和服務管理應用。相關文檔:http://logback.qos.ch/manual/jmxConfig.html

appender

日誌輸出組件,主要負責日誌的輸出以及格式化日誌。常用的屬性有name和class。

  • name:appender組件的名稱,後面給logger指定appender使用。
  • class:appender的具體實現類。常用的有 ConsoleAppender、FileAppender、RollingFileAppender。

appender的具體實現類:

  • ConsoleAppender:向控制台輸出日誌內容的組件,只要定義好encoder節點就可以使用。
  • FileAppender:向文件輸出日誌內容的組件,用法也很簡單,不過由於沒有日誌滾動策略,一般很少使用。
  • RollingFileAppender:向文件輸出日誌內容的組件,同時可以配置日誌文件滾動策略,在日誌達到一定條件後生成一個新的日誌文件。

Threshold filter

Logback 定義的日誌列印級別的過濾器。可以過濾掉指定級別以下的日誌不輸出到文件。

encoder charset

表示對日誌進行編碼。

encoder pattern

  • %d{HH:mm:ss.SSS} —— 日誌輸出時間。
  • %thread —— 輸出日誌的進程名稱,用方括弧括起來。這個資訊在 Web 應用以及非同步任務處理中很有用。
  • %-5level —— 日誌級別,使用5個字元靠左對齊。
  • %logger{36} —— 日誌輸出者的名字。
  • %msg —— 日誌消息。
  • %n —— 換行符。

rollingPolicy

日誌記錄器的滾動策略。

  • FileNamePattern:定義日誌的切分方式,本文把每一天的日誌歸檔到一個文件。
  • MaxHistory:表示日誌保留的天數,本文設置為30天。

logger

用來設置某一個包或者具體的某一個類的日誌列印級別、以及指定

  • name:用來指定受此logger約束的某一個包或者具體的某一個類。
  • level:用來設置列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特殊值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設置此屬性,那麼當前logger將會繼承上級的級別。

使用mybatis的時候,sql語句只有在 debug 級別下才會列印

root

必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性
level:用來設置列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置為INHERITED或者同義詞NULL。默認是 DEBUG 可以包含零個或多個元素,標識這個appender將會添加到這個logger。

示例程式碼

github

碼雲

非特殊說明,本文版權歸 朝霧輕寒 所有,轉載請註明出處.

原文標題:Spring Boot 2.X(十四):日誌功能 Logback

原文地址:https://www.zwqh.top/article/info/23

如果文章對您有幫助,請掃碼關注下我的公眾號,文章持續更新中…