天天看點

springboot項目根據yml或者properties屬性設定logback多環境配置

  • 實作思路

通過在logback配置檔案中引入yml或properties中的屬性,進而實作通過yml或者properties配置實作logback屬性配置。

  • 實作步驟

以application.yml,application-dev.yml檔案為例

         1.在application.yml檔案中設定活躍檔案來引用dev。

spring:
  profiles:
   active: dev
           

         2.在application-dev.yml檔案中設定logback要引用的屬性,以logback.path為例

logback:
  path: /home/test
           

         3.在logback-spring.xml檔案中通過springProperty标簽引用application-dev.yml的屬性,注意是logback-spring.xml檔案而不是logback.xml檔案,因為logback.xml檔案早于application.yml加載,logback-spring.xml檔案晚于application.yml檔案加載。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProperty scope="context" name="LOG_DIR" source="logback.path"/>
    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
    <property name="FILE_LOG_PATTERN" value="%date [%level] [%thread] [%file : %line] %msg%n" />
    <!-- %m輸出的資訊,%p日志級别,%t線程名,%d日期,%c類的全名,%i索引【從數字0開始遞增】,,, -->
    <!-- appender是configuration的子節點,是負責寫日志的元件。 -->
    <!-- ConsoleAppender:把日志輸出到控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <!-- 控制台也要使用UTF-8,不要使用GBK,否則會中文亂碼 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!-- RollingFileAppender:滾動記錄檔案,先将日志記錄到指定檔案,當符合某個條件時,将日志記錄到其他檔案 -->
    <!-- 以下的大概意思是:1.先按日期存日志,日期變了,将前一天的日志檔案名重命名為XXX%日期%索引,新的日志仍然是demo.log -->
    <!--             2.如果日期沒有發生變化,但是目前日志的檔案大小超過1KB時,對目前日志進行分割 重命名-->
    <appender name="fileServiceLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_DIR}/${APP_NAME}.log</File>
        <!-- rollingPolicy:當發生滾動時,決定 RollingFileAppender 的行為,涉及檔案移動和重命名。 -->
        <!-- TimeBasedRollingPolicy: 最常用的滾動政策,它根據時間來制定滾動政策,既負責滾動也負責出發滾動 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 活動檔案的名字會根據fileNamePattern的值,每隔一段時間改變一次 -->
            <!-- 檔案名:log/demo.2017-12-05.0.log -->
            <fileNamePattern>${LOG_DIR}/%d{yyyy/MM/dd}/${APP_NAME}.%d{yyyy-MM-dd}(%i).log</fileNamePattern>
            <!--  注意,maxHistory代表的是最大存檔檔案的數量,不是存檔期限。達到門檻值時,删除最老的日志 -->
            <maxHistory>30</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- maxFileSize:這是活動檔案的大小,預設值是10MB,測試時可改成1KB看效果 -->
                <maxFileSize>2000MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <!-- pattern節點,用來設定日志的輸入格式 -->
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <!-- 記錄日志的編碼:此處設定字元集 - -->
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="fileServiceLogError" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_DIR}/${APP_NAME}-error.log</File>
        <!-- rollingPolicy:當發生滾動時,決定 RollingFileAppender 的行為,涉及檔案移動和重命名。 -->
        <!-- TimeBasedRollingPolicy: 最常用的滾動政策,它根據時間來制定滾動政策,既負責滾動也負責出發滾動 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 活動檔案的名字會根據fileNamePattern的值,每隔一段時間改變一次 -->
            <!-- 檔案名:log/demo-error.2017-12-05.0.log -->
            <fileNamePattern>${LOG_DIR}/%d{yyyy/MM/dd}/${APP_NAME}-error.%d{yyyy-MM-dd}(%i).log</fileNamePattern>
            <!-- 注意,maxHistory代表的是最大存檔檔案的數量,不是存檔期限。達到門檻值時,删除最老的日志 -->
            <maxHistory>30</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- maxFileSize:這是活動檔案的大小,預設值是10MB,測試時可改成1KB看效果 -->
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <!-- pattern節點,用來設定日志的輸入格式 -->
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <!-- 記錄日志的編碼:此處設定字元集 - -->
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 控制台輸出日志級别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="fileServiceLog" />
        <appender-ref ref="fileServiceLogError" />
    </root>
    <!-- 指定項目中某個包,當有日志操作行為時的日志記錄級别 -->
    <!-- com.xxx為根包,也就是隻要是發生在這個根包下面的所有日志操作行為的權限都是DEBUG -->
    <!-- 級别依次為: TRACE < DEBUG < INFO <  WARN < ERROR < ALL ​​​​​​​/OFF  -->
    <logger name="java.sql" value="DEBUG" />
    <logger name="com.ibatis" value="DEBUG" />
    <logger name="com.xxx" level="DEBUG">
        <appender-ref ref="fileServiceLog" />
        <appender-ref ref="fileServiceLogError" />
    </logger>
</configuration>
           

繼續閱讀