1. 程式人生 > >使用SpringBoot2.0搭建企業級應用開發框架(四)配置LogBack日誌

使用SpringBoot2.0搭建企業級應用開發框架(四)配置LogBack日誌

  • 前言

SpringBoot預設配置提供了對常用日誌的支援,如:Java Util Logging、Log4J、Log4J2和Logback,每種Logger都可以通過配置使用控制檯或者檔案輸出日誌內容

Logback是log4j框架的作者開發的新一代日誌框架,它效率更高、能夠適應諸多的執行環境,同時天然支援slf4j,SpringBoot預設使用LogBack來記錄日誌,並用INFO級別輸出到控制檯

  • 配置

在com/resources/下建立LogBack配置檔案logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--說明文件地址http://tengj.top/2017/04/05/springboot7/-->

<!--scan: 當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。-->
<!--scanPeriod: 設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。
    當scan為true時,此屬性生效。預設的時間間隔為1分鐘。-->
<!--debug: 當此屬性設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <property name="appName" value="demo"></property>
    <property name="logPath" value="/applog/logs/demoApplication/"></property>
    <!-- 彩色日誌格式 -->
    <property name="colorParttern" value="%d{HH:mm:ss.SSS} %contextName [%yellow(%thread)] %highlight(%-5level) %green(%logger){36} - %msg%n"></property>
    <property name="normalParttern" value="%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n"></property>
    <contextName>${appName}</contextName>

    <!--輸出到控制檯-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             &lt;!&ndash; 此appender是為開發使用,只配置最底級別,控制檯輸出的日誌級別是大於或等於此級別的日誌資訊 &ndash;&gt;
             <level>DEBUG</level>
        </filter>-->
        <encoder>
            <pattern>${colorParttern}</pattern>
        </encoder>
    </appender>

    <!--INFO檔案-->
    <appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌檔案的路徑及檔名 -->
        <file>${logPath}/logback_info.log</file>
        <!--日誌檔案輸出格式-->
        <encoder>
            <pattern>${normalParttern}</pattern>
            <charset>UTF-8</charset> <!-- 設定字符集 -->
        </encoder>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/logback-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--日誌檔案保留天數-->
            <maxHistory>30</maxHistory>
            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 此日誌檔案只記錄info級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--WARN檔案-->
    <appender name="warn_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌檔案的路徑及檔名 -->
        <file>${logPath}/logback_warn.log</file>
        <!--日誌檔案輸出格式-->
        <encoder>
            <pattern>${normalParttern}</pattern>
            <charset>UTF-8</charset> <!-- 設定字符集 -->
        </encoder>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/logback-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--日誌檔案保留天數-->
            <maxHistory>30</maxHistory>
            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 此日誌檔案只記錄warn級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--異常日誌檔案-->
    <appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌檔案的路徑及檔名 -->
        <file>${logPath}/logback_error.log</file>
        <encoder>
            <pattern>${normalParttern}</pattern>
            <charset>UTF-8</charset> <!-- 設定字符集 -->
        </encoder>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/logback-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 只打印錯誤日誌 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--root其實也是一個特殊的logger,用來指定最基礎的日誌輸出級別,只有一個level屬性
    不能設定為INHERITED或者同義詞NULL,預設是DEBUG
    可以包含零個或多個元素,標識這個appender將會新增到這個logger-->
    <root level="INFO">
        <appender-ref ref="console" />
        <appender-ref ref="info_file" />
        <appender-ref ref="warn_file" />
        <appender-ref ref="error_file" />
    </root>

    <!--  <logger>用來設定某一個包或者具體的某一個類的日誌列印級別、以及指定<appender> -->
    <!-- name:用來指定受此logger約束的某一個包或者具體的某一個類 -->
    <!-- addtivity:是否向上級logger傳遞列印資訊。預設是true -->
    <!--level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
        還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別
        如果未設定此屬性,那麼當前logger將會繼承上級的級別
    -->
    <logger name="com.example.demo.mapper" level="DEBUG" additivity="false">
        <appender-ref ref="console"/>
    </logger>

</configuration>

彩色日誌輸出格式如果應用到檔案輸出中會造成亂碼,所以在列印臺中使用即可

關於配置的詳解請參閱http://aub.iteye.com/blog/1101222

  • 日誌使用理解

如果你有認真閱讀理解關於logback配置的詳解的話,就應該理解到:

1、appender 是一個列印工具,有具體的列印策略,需要接收日誌的輸入才能執行

2、logger 可以理解為一個日誌篩選器,會從指定目錄篩選符合自己設定級別的日誌

3、root 是一個特殊的logger,與logger的區別在於它篩選的是全域性而不是指定目錄

以上三個都具有自己的級別設定,這個設定可以理解為過濾鏈,最終能通過的肯定負責最底層的篩選,即appender的級別設定,鑑於日誌的靈活配置,建議使用方式為:

1、控制列印臺的appender不進行級別設定

2、root預設info即可,如果為debug級別則會列印太多框架執行資訊

3、由logger設定特殊的級別篩選進行自定義列印臺輸出

4、正式環境如不需要列印臺資訊,需要通過本系列的 多環境配置 將列印臺相關logger與appender-ref註釋掉