Spring Boot 中使用 Logback
個人學習SpringBoot系列 Swagger篇
Github Link: https://github.com/panjianlong13/SpringBoot-SpringCloud/tree/master/spring-boot-swagger
Logback介紹
Logback 是什麼
Logback是由log4j創始人設計的又一個開源日誌元件。logback當前分成三個模組:logback-core,logback- classic和logback-access。logback-core是其它兩個模組的基礎模組。logback-classic是log4j的一個 改良版本。此外logback-classic完整實現SLF4J API使你可以很方便地更換成其它日誌系統如log4j或JDK14 Logging。logback-access訪問模組與
為什麼使用logback
1.核心重寫、測試充分、初始化記憶體載入更小,這一切讓logback效能和log4j相比有諸多倍的提升
2.logback非常自然地直接實現了slf4j,這個嚴格來說算不上優點,只是這樣,再理解slf4j的前提下會很容易理解logback,也同時很容易用其他日誌框架替換logback
3.logback有比較齊全非常充分的文件
4.logback當配置檔案修改了,支援自動重新載入配置檔案,掃描過程快且安全,它並不需要另外建立一個掃描執行緒
5.支援自動去除舊的日誌檔案,可以控制已經產生日誌檔案的最大數量,自動壓縮日誌成為歸檔檔案
logback結構
logback-core提供了LogBack的核心功能,是另外兩個元件的基礎。
logback-classic則實現了Slf4j
的API
,所以當想配合Slf4j使用時,需要將logback-classic
加入classpath
。
logback-access是為了整合Servlet
環境而準備的,可提供HTTP-access
的日誌介面。
Swagger實戰
新建SpringBoot專案
在pom.xml中新增依賴
配置檔案
application.properties
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日誌根目錄-->
<springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="./data/logs/spring-boot-logback"/>
<!-- 日誌級別 -->
<springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="DEBUG"/>
<!-- 標識這個"STDOUT" 將會新增到這個logger -->
<springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/>
<!-- 日誌檔名稱-->
<property name="LOG_PREFIX" value="spring-boot-logback" />
<!-- 日誌檔案編碼-->
<property name="LOG_CHARSET" value="UTF-8" />
<!-- 日誌檔案路徑+日期-->
<property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}" />
<!--對日誌進行格式化-->
<property name="LOG_MSG" value="- | [%X{requestUUID}] | [%d{yyyyMMdd HH:mm:ss.SSS}] | [%level] | [${HOSTNAME}] | [%thread] | [%logger{36}] | --> %msg|%n "/>
<!--檔案大小,預設10MB-->
<property name="MAX_FILE_SIZE" value="50MB" />
<!-- 配置日誌的滾動時間 ,表示只保留最近 10 天的日誌-->
<property name="MAX_HISTORY" value="10"/>
<!--輸出到控制檯-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 輸出的日誌內容格式化-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${LOG_MSG}</pattern>
</layout>
</appender>
<!--輸出到檔案-->
<appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender">
</appender>
<!-- 定義 ALL 日誌的輸出方式:-->
<appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日誌檔案路徑,日誌檔名稱-->
<File>${LOG_HOME}/all_${LOG_PREFIX}.log</File>
<!-- 設定滾動策略,當天的日誌大小超過 ${MAX_FILE_SIZE} 檔案大小時候,新的內容寫入新的檔案, 預設10MB -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日誌檔案路徑,新的 ALL 日誌檔名稱,“ i ” 是個變數 -->
<FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}%i.log</FileNamePattern>
<!-- 配置日誌的滾動時間 ,表示只保留最近 10 天的日誌-->
<MaxHistory>${MAX_HISTORY}</MaxHistory>
<!--當天的日誌大小超過 ${MAX_FILE_SIZE} 檔案大小時候,新的內容寫入新的檔案, 預設10MB-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 輸出的日誌內容格式化-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${LOG_MSG}</pattern>
</layout>
</appender>
<!-- 定義 ERROR 日誌的輸出方式:-->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 下面為配置只輸出error級別的日誌 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<OnMismatch>DENY</OnMismatch>
<OnMatch>ACCEPT</OnMatch>
</filter>
<!--日誌檔案路徑,日誌檔名稱-->
<File>${LOG_HOME}/err_${LOG_PREFIX}.log</File>
<!-- 設定滾動策略,當天的日誌大小超過 ${MAX_FILE_SIZE} 檔案大小時候,新的內容寫入新的檔案, 預設10MB -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日誌檔案路徑,新的 ERR 日誌檔名稱,“ i ” 是個變數 -->
<FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}%i.log</FileNamePattern>
<!-- 配置日誌的滾動時間 ,表示只保留最近 10 天的日誌-->
<MaxHistory>${MAX_HISTORY}</MaxHistory>
<!--當天的日誌大小超過 ${MAX_FILE_SIZE} 檔案大小時候,新的內容寫入新的檔案, 預設10MB-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 輸出的日誌內容格式化-->
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>${LOG_MSG}</Pattern>
</layout>
</appender>
<!-- additivity 設為false,則logger內容不附加至root ,配置以配置包下的所有類的日誌的列印,級別是 ERROR-->
<logger name="org.springframework" level="ERROR" />
<logger name="org.apache.commons" level="ERROR" />
<logger name="org.apache.zookeeper" level="ERROR" />
<logger name="com.alibaba.dubbo.monitor" level="ERROR"/>
<logger name="com.alibaba.dubbo.remoting" level="ERROR" />
<!-- ${LOG_ROOT_LEVEL} 日誌級別 -->
<root level="${LOG_ROOT_LEVEL}">
<!-- 標識這個"${STDOUT}"將會新增到這個logger -->
<appender-ref ref="${STDOUT}"/>
<!-- FILE_ALL 日誌輸出新增到 logger -->
<appender-ref ref="FILE_ALL"/>
<!-- FILE_ERROR 日誌輸出新增到 logger -->
<appender-ref ref="FILE_ERROR"/>
</root>
</configuration>
自定義攔截器
攔截器配置
日誌切面
測試Logback
瀏覽器訪問:http://127.0.0.1:8080/index/?content=petertest
輸出具體內容
1.RequestUUID (每一次請求UUID唯一)
2.時間戳
3.日誌級別 ERROR,WARN,INFO,DEBUG,TRACE
4.Hostname
5.程序
6.類路徑
7. 分隔符 -->
8.實際日誌內容
日誌路徑