springboot學習總結系列(一):多環境下(開發環境,生產環境)logback的配置(使用yml(properties同理),方便生產環境和開發環境的自由切換)

本文主要講解springboot項目下,如何通過修改一行配置文件,自由切換生產環境和開發環境logback的不同配置;

核心是解決了不同環境下由於對日誌記錄要求的不一樣(日誌級別、記錄形式等)而需要不同配置的情況下,方便我們自由切換配置內容(至於logback的核心配置,這裏不做贅述);

一、首先我們創建一個標準的maven項目,引入springboot的相關依賴,這裏不再贅述(可以參考https://blog.csdn.net/mayunju/article/details/78721107前半部分);

二、我們在src/main/resources下面創建4個文件,截圖如下:

三、這裏貼一下yml和logback-spring.xml與本分享相關的核心內容

application.yml:

spring:
  # dev || prod
  profiles:
    active: prod

這裏通過配置profiles.active的值來切換使用-dev還是-prod的配置文件,但-dev和-prod的內容不再貼出,和本分享關係不大;

logback-spring.xml:

    <!-- 開發環境 -->
    <springProfile name="dev">
        <!-- Root logger的定義 OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL  -->
        <root level="DEBUG" >
            <appender-ref ref="CONSOLE-APPENDER" />
        </root>
        <!-- 以下是logger的定義 -->
        <!-- 在控制檯輸出debug級別日誌 name屬性為dao層接口的路徑 ,生產環境不需要,開發環境調試用-->
        <logger name="*.sys.mapper" level="DEBUG" />
    </springProfile>

    <!-- 生產環境 -->
    <springProfile name="prod">
        <!-- Root logger的定義 OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL  -->
        <root level="ERROR" >
            <appender-ref ref="CONSOLE-APPENDER" />
            <appender-ref ref="FILE-APPENDER" />
        </root>
    </springProfile>

重點是<springProfile>的name屬性值,這樣我們可以配置在不同的環境使用不用的appender,用於配置是僅僅將日誌信息打印到控制檯還是輸出的磁盤文件中,以及輸出不同級別的日誌等(這裏不做贅述);

四、核心分享到這裏已經完畢,下面貼一個完整的日誌配置文件,僅供參考

特別注意:如果使用 EvaluatorFilter 請在pom.xml引入以下依賴

        <!-- logback EvaluatorFilter需要 -->
        <!-- https://mvnrepository.com/artifact/org.codehaus.janino/janino -->
        <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>janino</artifactId>
            <version>3.0.14</version>
        </dependency>

比如下面貼的配置文件,我在生產環境的配置中過濾了兩個異常:

org.apache.catalina.connector.ClientAbortException和另一個我項目中自定義的異常類,不在日誌文件中記錄這兩個意義不大的異常信息,一般第一個異常都不需要記錄,是因爲客戶端主動放棄請求導致的;

logback-spring.xml:

<?xml version="1.0" encoding="UTF-8" ?>

<!-- 日誌組件啓動時,打印調試信息,並監控此文件變化,週期120秒 -->
<!-- debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false -->
<configuration scan="false" scanPeriod="120 seconds" debug="false">

    <!-- 項目名稱及日誌目錄定義 -->
    <property name="PROJECT_NAME" value="yourProjectName" />
    <property name="FILE-APPENDER_LOG_LEVEL" value="WARN" />
    <property name="LOG_PATH" value="../webapps/${PROJECT_NAME}-log/${FILE-APPENDER_LOG_LEVEL}" />

    <!-- 每個logger都關聯到logger上下文,默認上下文名稱爲“default”。 但可以使用<contextName>設置成其他名字,用於區分不同應用程序的記錄。一旦設置,不能修改。 -->
    <contextName>${PROJECT_NAME}</contextName>

    <!-- 以下是appender的定義 -->

    <!-- ConsoleAppender 記錄到控制檯,僅用於本地開發 -->
    <!-- 本地開發環境只需要控制檯輸出,開發環境可刪除其他appender,只使用該appender -->
    <appender name="CONSOLE-APPENDER" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}- [%contextName]- [%thread]- [%-5level]- [%logger{36}]- [%msg]- %n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 輸出到文件RollingFileAppender 生產環境一定需要-->
    <!-- <Appender> 有多個過濾器時,按照配置順序執行 -->
    <appender name="FILE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!-- 其中file屬性定義文件的帶全路徑的文件名 -->
        <!--<file>${LOG_PATH}/${PROJECT_NAME}-warn.log</file>-->

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度,%msg:日誌消息,%n是換行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}- [%contextName]- [%thread]- [%-5level]- [%logger{36}]- [%msg] - %n</pattern>
            <charset>UTF-8</charset>
        </encoder>

        <!-- rollingPolicy:當發生滾動時,決定 RollingFileAppender的行爲,涉及文件移動和重命名。 -->

        <!-- TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責觸發滾動 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${LOG_PATH}/${PROJECT_NAME}-warn.%d{yyyy-MM-dd}.%i.log</FileNamePattern>

            <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 10GB -->
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>60</maxHistory>

            <!-- 來指定日誌文件的上限大小,例如設置爲10GB的話,那麼到了這個值,就會刪除舊的日誌 -->
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>

        <!-- ThresholdFilter: 臨界值過濾器,過濾掉所有低於warn級別的日誌。 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 設置過濾級別 -->
            <level>${FILE-APPENDER_LOG_LEVEL}</level>
        </filter>

        <filter class ="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator>
                <expression>org.apache.catalina.connector.ClientAbortException.class.isInstance(throwable)</expression>
                <expression>cn.**.common.exception.NoPermissionException.class.isInstance(throwable)</expression>
            </evaluator>
            <!-- 返回DENY,日誌將立即被拋棄不再經過其他過濾器 -->
            <onMatch>DENY</onMatch>
        </filter>

    </appender>

    <!-- 開發環境 -->
    <springProfile name="dev">
        <!-- Root logger的定義 OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL  -->
        <root level="DEBUG" >
            <appender-ref ref="CONSOLE-APPENDER" />
        </root>
        <!-- 以下是logger的定義 -->
        <!-- 在控制檯輸出debug級別日誌 name屬性為dao層接口的路徑 ,生產環境不需要,開發環境調試用-->
        <logger name="cn.**.sys.mapper" level="DEBUG" /> <!-- 根據自己的項目配置合適的路徑 -->
    </springProfile>

    <!-- 生產環境 -->
    <springProfile name="prod">
        <!-- Root logger的定義 OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL  -->
        <root level="ERROR" >
            <appender-ref ref="CONSOLE-APPENDER" />
            <appender-ref ref="FILE-APPENDER" />
        </root>
    </springProfile>

</configuration>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章