1. 程式人生 > >Spring Boot 中使用 Logback

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訪問模組與

Servlet容器整合提供通過Http來訪問日誌的功能。

 

為什麼使用logback

1.核心重寫、測試充分、初始化記憶體載入更小,這一切讓logback效能和log4j相比有諸多倍的提升

2.logback非常自然地直接實現了slf4j,這個嚴格來說算不上優點,只是這樣,再理解slf4j的前提下會很容易理解logback,也同時很容易用其他日誌框架替換logback

3.logback有比較齊全非常充分的文件

4.logback當配置檔案修改了,支援自動重新載入配置檔案,掃描過程快且安全,它並不需要另外建立一個掃描執行緒

5.支援自動去除舊的日誌檔案,可以控制已經產生日誌檔案的最大數量,自動壓縮日誌成為歸檔檔案

 

logback結構

logback-core提供了LogBack的核心功能,是另外兩個元件的基礎。

logback-classic則實現了Slf4jAPI,所以當想配合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.實際日誌內容

日誌路徑