日志框架 - 基于spring-boot - 實(shí)現(xiàn)1 - 配置文件

日志框架系列講解文章
日志框架 - 基于spring-boot - 使用入門
日志框架 - 基于spring-boot - 設(shè)計(jì)
日志框架 - 基于spring-boot - 實(shí)現(xiàn)1 - 配置文件
日志框架 - 基于spring-boot - 實(shí)現(xiàn)2 - 消息定義及消息日志打印
日志框架 - 基于spring-boot - 實(shí)現(xiàn)3 - 關(guān)鍵字與三種消息解析器
日志框架 - 基于spring-boot - 實(shí)現(xiàn)4 - HTTP請(qǐng)求攔截
日志框架 - 基于spring-boot - 實(shí)現(xiàn)5 - 線程切換
日志框架 - 基于spring-boot - 實(shí)現(xiàn)6 - 自動(dòng)裝配

上一篇我們講解了日志框架的總體設(shè)計(jì)
本篇講日志框架實(shí)現(xiàn)的第一部分:配置文件

Spring Boot默認(rèn)日志框架是logback,實(shí)現(xiàn)日志框架需要自定義logback的配置,根據(jù)官方文檔的指引,在classpath目錄下新增文件名為logback-spring.xml的配置文件。文件內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!--第1步. 引入spring-boot提供的默認(rèn)格式配置-->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!--第2步.定義從application.properties引入的配置-->  
    <!--spring-boot logging.path-->
    <property name="LOG_PATH" value="${LOG_PATH:-./logs}"/>
    <!--spring-boot logging.file-->
    <property name="LOG_FILE"
              value="${LOG_PATH}/${LOG_FILE:-spring.log}"/>
    <springProperty scope="context" name="ROOT_PACKAGE"
                    source="xpay.framework.logging.package.root"
                    defaultValue="com"/>
    <springProperty scope="context" name="LOG_TO_CONSOLE"
                    source="xpay.framework.logging.log-to-console"
                    defaultValue="false"/>
    <!--message log patterns-->
    <springProperty scope="context" name="MESSAGE_FILENAME_PATTERN"
                    source="xpay.framework.logging.logback.message.filename.pattern"
                    defaultValue="%d{yyyy-MM-dd}/message.log.%d{yyyy-MM-dd}"/>
    <springProperty scope="context" name="MESSAGE_ENCODER_PATTERN"
                    source="xpay.framework.logging.logback.message.encoder.pattern"
                    defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n"/>
    <springProperty scope="context" name="MESSAGE_MAX_FILE_SIZE"
                    source="xpay.framework.logging.logback.message.max-file-size"
                    defaultValue="200MB"/>
    <!--system log patterns-->
    <springProperty scope="context" name="SYSTEM_FILENAME_PATTERN"
                    source="xpay.framework.logging.logback.system.filename.pattern"
                    defaultValue="%d{yyyy-MM-dd}/info.log.%d{yyyy-MM-dd}"/>
    <springProperty scope="context" name="SYSTEM_ENCODER_PATTERN"
                    source="xpay.framework.logging.logback.system.encoder.pattern"
                    defaultValue="${FILE_LOG_PATTERN}"/>
    <springProperty scope="context" name="SYSTEM_MAX_FILE_SIZE"
                    source="xpay.framework.logging.logback.system.max-file-size"
                    defaultValue="200MB"/>
    <!--alarm log patterns-->
    <springProperty scope="context" name="ALARM_FILENAME_PATTERN"
                    source="xpay.framework.logging.logback.alarm.filename.pattern"
                    defaultValue="alarm/alarm.log.%d{yyyy-MM-dd}"/>
    <springProperty scope="context" name="ALARM_ENCODER_PATTERN"
                    source="xpay.framework.logging.logback.alarm.encoder.pattern"
                    defaultValue="${FILE_LOG_PATTERN}"/>
    <!--第3步. 引入spring-boot提供的默認(rèn)文件配置-->
    <include
            resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <include
            resource="org/springframework/boot/logging/logback/file-appender.xml"/>

    <!--第4步. 定義三種日志 Appender-->
    <!-- 處理消息日志 -->
    <appender name="MESSAGE_APPENDER"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${MESSAGE_FILENAME_PATTERN}.%i
            </fileNamePattern>
            <maxFileSize>${MESSAGE_MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>
        <encoder>
            <outputPatternAsHeader>true</outputPatternAsHeader>
            <charset>utf8</charset>
            <pattern>${MESSAGE_ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="ASYNC_MESSAGE_APPENDER"
              class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <!--以每個(gè)日志內(nèi)容2KB大小計(jì)算,最大緩存10MB的日志。-->
        <queueSize>5000</queueSize>
        <!--單位為毫秒-->
        <maxFlushTime>1000</maxFlushTime>
        <appender-ref ref="MESSAGE_APPENDER"/>
    </appender>
    <!-- 系統(tǒng)運(yùn)行日志 -->
    <appender name="SYSTEM_APPENDER"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${SYSTEM_FILENAME_PATTERN}.%i
            </fileNamePattern>
            <maxFileSize>${SYSTEM_MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>
        <encoder>
            <outputPatternAsHeader>true</outputPatternAsHeader>
            <charset>utf8</charset>
            <pattern>${SYSTEM_ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="ASYNC_SYSTEM_APPENDER"
              class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <!--以每個(gè)日志內(nèi)容0.5KB大小為基礎(chǔ),大約允許緩存10MB的日志。-->
        <queueSize>20000</queueSize>
        <!--單位為毫秒-->
        <maxFlushTime>1000</maxFlushTime>
        <appender-ref ref="SYSTEM_APPENDER"/>
    </appender>
    <!-- 告警日志記錄 -->
    <appender name="ALARM_APPENDER"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!--deny all events with a level below this level-->
            <level>WARN</level>
        </filter>
        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${ALARM_FILENAME_PATTERN}
            </fileNamePattern>
        </rollingPolicy>
        <encoder>
            <outputPatternAsHeader>true</outputPatternAsHeader>
            <charset>utf8</charset>
            <pattern>${ALARM_ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="ASYNC_ALARM_APPENDER"
              class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <!--以每個(gè)日志內(nèi)容0.5KB大小為基礎(chǔ),大約允許緩存1MB的日志。-->
        <queueSize>2000</queueSize>
        <!--單位為毫秒 -->
        <maxFlushTime>500</maxFlushTime>
        <appender-ref ref="ALARM_APPENDER"/>
    </appender>


    <!--第5步. 定義默認(rèn)的logger 與appender 的對(duì)應(yīng)關(guān)第-->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="ASYNC_SYSTEM_APPENDER"/>
        <appender-ref ref="ASYNC_ALARM_APPENDER"/>
    </root>
    <if condition='property("LOG_TO_CONSOLE").contains("true")'>
        <then>
            <logger name="${ROOT_PACKAGE}" level="INFO" additivity="true">
                <appender-ref ref="ASYNC_ALARM_APPENDER"/>
                <appender-ref ref="ASYNC_SYSTEM_APPENDER"/>
            </logger>
        </then>
        <else>
            <logger name="${ROOT_PACKAGE}" level="INFO" additivity="false">
                <appender-ref ref="ASYNC_ALARM_APPENDER"/>
                <appender-ref ref="ASYNC_SYSTEM_APPENDER"/>
            </logger>
        </else>
    </if>
    <logger name="com.cmsz.framework.logging.aop.MessageToLogAspect"
            level="INFO" additivity="true">
        <appender-ref ref="ASYNC_MESSAGE_APPENDER"/>
    </logger>
</configuration>

如上文件所示,配置文件包含幾個(gè)部分:

  1. 引入配置文件Spring Boot在org.springframework.boot.logging.logback包中提供了4個(gè)默認(rèn)的logback配置文件,分別是base.xml,console-appender.xml,defaults.xml,file-appender.xml,本配置文件里在第1步與第3步中分別引入。
  2. 定義配置項(xiàng):為了在Spring Boot的配置文件(如application.properties文件)中能配置日志文件名及日志打印格式,第2步定義了許多與Spring配置項(xiàng)對(duì)應(yīng)的屬性(property
    3.定義Appender: 第4步分別為三種日志(系統(tǒng)運(yùn)行日志,消息日志與告警日志)定義輸出文件及格式,并使用異步的Appender避免I/O成為系統(tǒng)性能開銷的瓶頸。
  3. 定義Logger:第5步定義默認(rèn)的logger,與對(duì)應(yīng)的日志級(jí)別。

至此,logback的配置基本完成。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容