spring cloud腳手架專案(十一)logback配置

等那時夕顏發表於2020-10-20

前言

之前有寫到一個aop日誌輸出,當時沒有做好相關的logback配置。前幾個月在新公司給老系統升級的時候重寫了一個好用的aop的logback的配置。對於spring boot 的logback配置的xml檔案也有了很好的理解。這次接機說明一下。也為下一篇文章講到鏈路之間的日誌uuid的新增做準備

程式碼

以下就是詳細的xml配置檔案。每一行我都做了對應的註釋和說明

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!--spring boot原生預設配置,用到了default file 輸入格式   -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!--spring boot原生控制檯配置,需要引入default才可以    -->
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <!--log檔案格式中新增%contextName可以獲得這個值,參照history第一次提交-->
    <contextName>logback</contextName>
    <!--log檔案的預設資料夾的名稱和位置,獲得的引數為yml中的spring.application.name -->
    <springProperty scope="context" name="spring.application.name" source="spring.application.name"/>
    <property name="log.path" value="${spring.application.name}-log" />
    <!--日誌存放時間 該配置下為3天-->
    <property name="maxHistory" value="2" />
    <!--日誌分割大小為一個檔案,該配置下為10MB進行分割-->
    <property name="maxFileSize" value="10MB" />
    <!-- 普通日誌格式 [%X{TRACE_ID}]以及[%X{HEAD_ID}] 如果沒有看我的其他文章,可以去掉-->
    <property name="FILE_LOG_PATTERN" value="[%X{HEAD_ID}][%X{TRACE_ID}][%d{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level][%logger{40}]:%msg%n"/>
    <!--輸出到debug-->
    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}-log/debug-%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <maxFileSize>${maxFileSize}</maxFileSize>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只列印DEBUG日誌 -->
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--輸出到info-->
    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日誌最大儲存3天,並且每個日誌格式最大大小設定,舉例格式為2020-10-20-log/info-0.log -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}-log/info-%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <maxFileSize>${maxFileSize}</maxFileSize>
        </rollingPolicy>
        <!--日誌追加到結尾-->
        <append>true</append>
        <!--對記錄事件進行格式化-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <!--輸出到warn-->
    <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}-log/warn-%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <maxFileSize>${maxFileSize}</maxFileSize>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>
    <!--輸出到error-->
    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}-log/error-%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <maxFileSize>${maxFileSize}</maxFileSize>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只列印ERROR日誌 -->
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--輸出到other-->
    <appender name="other" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}-log/other-%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <maxFileSize>${maxFileSize}</maxFileSize>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>
    <!-- 不同的業務邏輯日誌列印到指定資料夾 additivity用於處理是否在其他日誌戰士,false不展示
    這個類是我的內部類,你的話如果要用就是用自己的內部類,或者去掉other和這個-->
    <logger name="com.chen.common.logAop.ParamsLogAspect" additivity="true" level="INFO">
        <appender-ref ref="other"/>
    </logger>
    <!-- 測試環境+開發環境. 多個使用逗號隔開. -->
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="debug"/>
            <appender-ref ref="info"/>
            <appender-ref ref="warn"/>
            <appender-ref ref="error"/>
        </root>
    </springProfile>
    <!-- 生產環境. -->
    <springProfile name="prd,stg">
        <root level="INFO">
            <appender-ref ref="info"/>
            <appender-ref ref="warn"/>
            <appender-ref ref="error"/>
        </root>
    </springProfile>
</configuration>

說明

這次的logback的配置中。我開始是使用了自己的配置。但是其實你如果什麼都不做設定的話。spring boot啟動的時候也會有一個預設的配置。那麼其實你的很多配置都可以直接參考,甚至直接引用。

像我的這個配置中。控制檯輸出的內容我是直接使用spring boot的預設配置的。如下圖:
在這裡插入圖片描述
我就是直接引用了
org/springframework/boot/logging/logback/defaults.xml
org/springframework/boot/logging/logback/console-appender.xml

而且對應的日誌格式中的內容也是基本複製的預設控制檯的配置,做出了稍微一點點的微調

[%X{TRACE_ID}]以及[%X{HEAD_ID}] 這2個引數是用做不同微服務之間的日誌鏈路傳遞使用的。在我的後幾篇文章中會提到。如果有影響了可以直接去掉即可

輸出到other這部分的日誌是我用做aop日誌格式輸出使用的。可以單獨答應介面的aop日誌。有利於我平時看日誌的

遇到的問題

logback列印出奇怪的日誌資料夾名稱,如圖所示,上一個紅框中是正確的,下一個紅框中是錯誤的。只有資料夾名稱不對,其他都對
在這裡插入圖片描述

解決辦法

如果之前沒有新增bootstrap.yml,需要新增這個。
其中的spring.application.name這個引數需要和其他yml中的引數保持一致。這樣才不會遇到我註釋用的那個問題。

#spring boot logback問題,啟動的時候如果spring.application.name 名字和application.yml中不一致的話,
#會導致產生2個日誌檔案,第一個是空的,第二個才是有的。用配置的方法解決。要保持一致
spring:
  application:
    name: SERVICE-A

問題原因

這個問題的原因是在spring boot啟動的時候logback要先於spring boot yml去獲得一些配置。用來以防止spring boot早起啟動發生問題的時候可以列印出錯誤資訊。如果沒有配置bootstrap.yml,他就獲得不到我在yml中配置好的應用名稱,所以就會列印出一個奇怪名字的日誌資料夾名字了

相關文章