SpringBoot專案從0到1設定logback紀錄檔列印

2023-07-03 21:00:38

大家好!我是sum墨,一個一線的底層碼農,平時喜歡研究和思考一些技術相關的問題並整理成文,限於本人水平,如果文章和程式碼有表述不當之處,還請不吝賜教。

以下是正文!

一、寫文背景

我們在寫後端專案的時候,紀錄檔列印是必需的。支援SpringBoot專案的紀錄檔框架一般有log4j、logback,這二者各有優劣,這裡就不展開對比了。我們專案中常用的是logback框架,該框架主要是一個logback-spring.xml組態檔起作用。每次起新的專案我都是從老專案中copy一份出來,這份組態檔內容很詳細,幾百行左右,我一般都是修改一下應用名、紀錄檔輸出路徑,新專案就可以用了。這份老檔案是之前的一個師兄留下的,我使用的時候也沒深入去思考過各個設定的作用,這段時間剛好比較空閒,打算從0開始寫出一個自己能看懂的logback-spring.xml

二、準備篇

首先,我準備了一個空的SpringBoot專案,版本為2.7.13。專案結構圖如下:

初始的pom.xml組態檔內容如下:

檢視程式碼

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.13</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>logback</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>logback</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!-- Springboot web模組-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
View Code

啟動紀錄檔輸出如下:

其次,引入logback核心元件,因為SpringBoot自帶logback元件,所以我們在引入的時候不需要指定logback的版本號。

<!-- logback核心元件 -->
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-core</artifactId>
</dependency>

 

最後,我們在resources目錄下新建一個空的logback-spring.xml檔案,程式碼如下:

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

 

這樣我們在啟動的時候,列印只有一個banner

三、基礎篇

1、輸出紀錄檔到控制檯(console)

剛才我們看到如果logback-spring.xml的設定為空的話,那麼只會輸出一個banner,其他的紀錄檔都不會被列印,所以我們第一步就是要把紀錄檔列印到控制檯上來。

第一步、設定控制檯的appender(logback中appender是負責寫紀錄檔的元件)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 設定紀錄檔列印格式 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] ${PID:- } %logger{36} %-5level - %msg%n</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
</configuration>

第二步、設定列印到控制檯的紀錄檔的級別

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 設定紀錄檔列印格式 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] ${PID:- } %logger{36} %-5level - %msg%n</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 設定輸出級別,加入輸出方式 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

 

這時控制檯已經有紀錄檔輸出了,輸出格式如下

第三步、加入logback預設的一些設定

上面自定義的輸出格式有點醜,logback給我們提供了一些預設的設定和格式,只需要使用include標籤引入即可。
程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 設定輸出級別,加入輸出方式 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

這時我們再啟動,發現樣式就好看多了

2、將紀錄檔輸出到檔案,如application.log檔案

剛才的紀錄檔是列印到控制檯的,我們一旦把ide關閉就看不到了,所以我們需要把紀錄檔輸出到一個檔案中,以便將紀錄檔留存下來。

第一步、定義應用名稱,區分應用

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

   <!--
定義應用名稱,區分應用 -->
   <property name="APP_NAME" value="logback-test"/>

  <!-- 設定控制檯輸出 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!-- 使用預設的輸出格式列印 --> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> </appender> <!-- 設定輸出級別,加入輸出方式 --> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration>

第二步、定義紀錄檔檔案的輸出路徑

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!-- 定義應用名稱,區分應用 -->
    <property name="APP_NAME" value="logback-test"/>
    <!-- 定義紀錄檔檔案的輸出路徑 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    
    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 設定輸出級別,加入輸出方式 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

第三步、定義紀錄檔檔名稱和路徑

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!-- 定義應用名稱,區分應用 -->
    <property name="APP_NAME" value="logback-test"/>
    <!-- 定義紀錄檔檔案的輸出路徑 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    <!-- 定義紀錄檔檔名稱和路徑 -->
    <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
    
    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 設定輸出級別,加入輸出方式 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

第四步、將紀錄檔卷動輸出到application.log檔案中

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!-- 定義應用名稱,區分應用 -->
    <property name="APP_NAME" value="logback-test"/>
    <!-- 定義紀錄檔檔案的輸出路徑 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    <!-- 定義紀錄檔檔名稱和路徑 -->
    <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>

    <!-- 將紀錄檔卷動輸出到application.log檔案中 -->
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 輸出檔案目的地 -->
        <file>${LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 設定輸出級別,加入輸出方式 -->
    <root level="INFO">
        <!-- 加入控制檯輸出 -->
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

第五步、設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式

<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
   
   <!-- 定義應用名稱,區分應用 --> <property name="APP_NAME" value="logback-test"/> <!-- 定義紀錄檔檔案的輸出路徑 --> <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/> <!-- 定義紀錄檔檔名稱和路徑 --> <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
  <!-- 將紀錄檔卷動輸出到application.log檔案中 --> <appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 輸出檔案目的地 --> <file>${LOG_FILE}</file> <encoder> <!-- 使用預設的輸出格式列印 --> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 檔案命名格式 --> <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 檔案保留最大天數 --> <maxHistory>7</maxHistory> <!-- 檔案大小限制 --> <maxFileSize>50MB</maxFileSize> <!-- 檔案總大小 --> <totalSizeCap>500MB</totalSizeCap> </rollingPolicy> </appender>

  <!-- 設定控制檯輸出 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!-- 使用預設的輸出格式列印 --> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> </appender>
  <!-- 設定輸出級別,加入輸出方式 --> <root level="INFO"> <!-- 加入控制檯輸出 --> <appender-ref ref="CONSOLE"/> </root> </configuration>

第六步、追加紀錄檔到APPLICATION中

<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    
  <!-- 定義應用名稱,區分應用 --> <property name="APP_NAME" value="logback-test"/> <!-- 定義紀錄檔檔案的輸出路徑 --> <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/> <!-- 定義紀錄檔檔名稱和路徑 --> <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
   <!-- 將紀錄檔卷動輸出到application.log檔案中 --> <appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 輸出檔案目的地 --> <file>${LOG_FILE}</file> <encoder> <!-- 使用預設的輸出格式列印 --> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 檔案命名格式 --> <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 檔案保留最大天數 --> <maxHistory>7</maxHistory> <!-- 檔案大小限制 --> <maxFileSize>50MB</maxFileSize> <!-- 檔案總大小 --> <totalSizeCap>500MB</totalSizeCap> </rollingPolicy> </appender>
 
  <!-- 設定控制檯輸出 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!-- 使用預設的輸出格式列印 --> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> </appender>
   <!-- 設定輸出級別,加入輸出方式 --> <root level="INFO"> <!-- 加入控制檯輸出 --> <appender-ref ref="CONSOLE"/> <!-- 加入APPLICATION輸出 --> <appender-ref ref="APPLICATION"/> </root> </configuration>

設定好之後,啟動專案,找到user.home會發現有一個logback-test的檔案,裡面有一個application.log檔案,如下圖

 

溫馨提示:如何找到user.home

在Windows上,可以通過開啟Windows資源管理器,然後在位址列中鍵入%userprofile%來找到user.home。

在Mac上,可以通過開啟終端應用程式,然後輸入echo $HOME命令來找到user.home。

在Linux上,可以通過開啟終端應用程式,然後輸入echo $HOME命令來找到user.home。

  

3、紀錄檔分級,將INFO、WARN、ERROR紀錄檔分別列印

其實INFO的紀錄檔已經在列印在控制檯中了,這裡我們需要單獨把WARN、ERROR拎出來列印,主要是為了方便後續排查bug使用。

第一步、定義WARN、ERROR紀錄檔檔案路徑

<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定義應用名稱,區分應用 -->
    <property name="APP_NAME" value="logback-test"/>
    <!-- 定義紀錄檔檔案的輸出路徑 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    <!-- 定義紀錄檔檔名稱和路徑 -->
    <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
    <!-- 定義警告級別紀錄檔檔名稱和路徑 -->
    <property name="WARN_LOG_FILE" value="${LOG_PATH}/warn.log"/>
    <!-- 定義錯誤級別紀錄檔檔名稱和路徑 -->
    <property name="ERROR_LOG_FILE" value="${LOG_PATH}/error.log"/>
    
    <!-- 將紀錄檔卷動輸出到application.log檔案中 -->
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 輸出檔案目的地 -->
        <file>${LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>
    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
    <!-- 設定輸出級別,加入輸出方式 -->
    <root level="INFO">
        <!-- 加入控制檯輸出 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 加入APPLICATION輸出 -->
        <appender-ref ref="APPLICATION"/>
    </root>
</configuration>

第二步、將WARN、ERROR紀錄檔摘取出並輸出到指定檔案中 

<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定義應用名稱,區分應用 -->
    <property name="APP_NAME" value="logback-test"/>
    <!-- 定義紀錄檔檔案的輸出路徑 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    <!-- 定義紀錄檔檔名稱和路徑 -->
    <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
    <!-- 定義警告級別紀錄檔檔名稱和路徑 -->
    <property name="WARN_LOG_FILE" value="${LOG_PATH}/warn.log"/>
    <!-- 定義錯誤級別紀錄檔檔名稱和路徑 -->
    <property name="ERROR_LOG_FILE" value="${LOG_PATH}/error.log"/>

    <!-- 將紀錄檔卷動輸出到application.log檔案中 -->
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 輸出檔案目的地 -->
        <file>${LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 摘取出WARN級別紀錄檔輸出到warn.log中 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${WARN_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將WARN相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!-- 摘取出ERROR級別紀錄檔輸出到error.log中 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${ERROR_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將ERROR相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
    <!-- 設定輸出級別,加入輸出方式 -->
    <root level="INFO">
        <!-- 加入控制檯輸出 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 加入APPLICATION輸出 -->
        <appender-ref ref="APPLICATION"/>
    </root>
</configuration>

第三步、將WARN、ERROR紀錄檔加到控制檯列印,並輸出到指定檔案中 

<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定義應用名稱,區分應用 -->
    <property name="APP_NAME" value="logback-test"/>
    <!-- 定義紀錄檔檔案的輸出路徑 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    <!-- 定義紀錄檔檔名稱和路徑 -->
    <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
    <!-- 定義警告級別紀錄檔檔名稱和路徑 -->
    <property name="WARN_LOG_FILE" value="${LOG_PATH}/warn.log"/>
    <!-- 定義錯誤級別紀錄檔檔名稱和路徑 -->
    <property name="ERROR_LOG_FILE" value="${LOG_PATH}/error.log"/>

    <!-- 將紀錄檔卷動輸出到application.log檔案中 -->
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 輸出檔案目的地 -->
        <file>${LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 摘取出WARN級別紀錄檔輸出到warn.log中 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${WARN_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將WARN相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!-- 摘取出ERROR級別紀錄檔輸出到error.log中 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${ERROR_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將ERROR相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 設定輸出級別 -->
    <root level="INFO">
        <!-- 加入控制檯輸出 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 加入APPLICATION輸出 -->
        <appender-ref ref="APPLICATION"/>
        <!-- 加入WARN紀錄檔輸出 -->
        <appender-ref ref="WARN"/>
        <!-- 加入ERROR紀錄檔輸出 -->
        <appender-ref ref="ERROR"/>
    </root>
</configuration>

在啟動之前,我分別加了一條WARN、ERROR紀錄檔,啟動時自動列印,如下

 同時在logback-test目錄下也生成了warn.log和error.log檔案。

 

四、進階篇

1、列印指定目錄下的紀錄檔

現在我們調整專案結構如下:

我想把service中的紀錄檔單獨列印出來,輸出到service.log中,步驟如下

第一步、定義指定目錄紀錄檔檔案輸出路徑 

<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定義應用名稱,區分應用 -->
    <property name="APP_NAME" value="logback-test"/>
    <!-- 定義紀錄檔檔案的輸出路徑 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    <!-- 定義紀錄檔檔名稱和路徑 -->
    <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
    <!-- 定義警告級別紀錄檔檔名稱和路徑 -->
    <property name="WARN_LOG_FILE" value="${LOG_PATH}/warn.log"/>
    <!-- 定義錯誤級別紀錄檔檔名稱和路徑 -->
    <property name="ERROR_LOG_FILE" value="${LOG_PATH}/error.log"/>
    <!-- 定義指定目錄service紀錄檔檔名稱和路徑 -->
    <property name="SERVICE_LOG_FILE" value="${LOG_PATH}/service.log"/>

    <!-- 將紀錄檔卷動輸出到application.log檔案中 -->
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 輸出檔案目的地 -->
        <file>${LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 摘取出WARN級別紀錄檔輸出到warn.log中 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${WARN_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將WARN相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!-- 摘取出ERROR級別紀錄檔輸出到error.log中 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${ERROR_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將ERROR相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 設定輸出級別 -->
    <root level="INFO">
        <!-- 加入控制檯輸出 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 加入APPLICATION輸出 -->
        <appender-ref ref="APPLICATION"/>
        <!-- 加入WARN紀錄檔輸出 -->
        <appender-ref ref="WARN"/>
        <!-- 加入ERROR紀錄檔輸出 -->
        <appender-ref ref="ERROR"/>
    </root>
</configuration>

第二步、定義指定目錄紀錄檔的appender

<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定義應用名稱,區分應用 -->
    <property name="APP_NAME" value="logback-test"/>
    <!-- 定義紀錄檔檔案的輸出路徑 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    <!-- 定義紀錄檔檔名稱和路徑 -->
    <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
    <!-- 定義警告級別紀錄檔檔名稱和路徑 -->
    <property name="WARN_LOG_FILE" value="${LOG_PATH}/warn.log"/>
    <!-- 定義錯誤級別紀錄檔檔名稱和路徑 -->
    <property name="ERROR_LOG_FILE" value="${LOG_PATH}/error.log"/>
    <!-- 定義指定目錄service紀錄檔檔名稱和路徑 -->
    <property name="SERVICE_LOG_FILE" value="${LOG_PATH}/service.log"/>

    <!-- 將紀錄檔卷動輸出到application.log檔案中 -->
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 輸出檔案目的地 -->
        <file>${LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 摘取出WARN級別紀錄檔輸出到warn.log中 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${WARN_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將WARN相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!-- 摘取出ERROR級別紀錄檔輸出到error.log中 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${ERROR_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將ERROR相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 定義指定目錄service的appender -->
    <appender name="SERVICE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${SERVICE_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/service.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 設定輸出級別 -->
    <root level="INFO">
        <!-- 加入控制檯輸出 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 加入APPLICATION輸出 -->
        <appender-ref ref="APPLICATION"/>
        <!-- 加入WARN紀錄檔輸出 -->
        <appender-ref ref="WARN"/>
        <!-- 加入ERROR紀錄檔輸出 -->
        <appender-ref ref="ERROR"/>
    </root>
</configuration>

第三步、追加紀錄檔到service的appender中

這裡我們不能直接將SERVICE加到root標籤下,要使用另外一個標籤logger,該標籤繼承了root,是子logger。該標籤有一個additivity屬性,若是additivity設為true,則子logger不止會在自己的appender裡輸出,還會在root的logger的appender裡輸出;若是additivity設為false,則子logger只會在自己的appender裡輸出,不會在root的logger的appender裡輸出

<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定義應用名稱,區分應用 -->
    <property name="APP_NAME" value="logback-test"/>
    <!-- 定義紀錄檔檔案的輸出路徑 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    <!-- 定義紀錄檔檔名稱和路徑 -->
    <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
    <!-- 定義警告級別紀錄檔檔名稱和路徑 -->
    <property name="WARN_LOG_FILE" value="${LOG_PATH}/warn.log"/>
    <!-- 定義錯誤級別紀錄檔檔名稱和路徑 -->
    <property name="ERROR_LOG_FILE" value="${LOG_PATH}/error.log"/>
    <!-- 定義指定目錄service紀錄檔檔名稱和路徑 -->
    <property name="SERVICE_LOG_FILE" value="${LOG_PATH}/service.log"/>

    <!-- 將紀錄檔卷動輸出到application.log檔案中 -->
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 輸出檔案目的地 -->
        <file>${LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 摘取出WARN級別紀錄檔輸出到warn.log中 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${WARN_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將WARN相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!-- 摘取出ERROR級別紀錄檔輸出到error.log中 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${ERROR_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將ERROR相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 定義指定目錄service的appender -->
    <appender name="SERVICE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${SERVICE_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/service.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 設定掃描包路徑,追加紀錄檔到service的appender中 -->
    <!--若是additivity設為true,則子Logger不止會在自己的appender裡輸出,還會在root的logger的appender裡輸出-->
    <logger name="com.example.logback.service" level="INFO" additivity="true">
        <appender-ref ref="SERVICE"/>
    </logger>

    <!-- 設定輸出級別 -->
    <root level="INFO">
        <!-- 加入控制檯輸出 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 加入APPLICATION輸出 -->
        <appender-ref ref="APPLICATION"/>
        <!-- 加入WARN紀錄檔輸出 -->
        <appender-ref ref="WARN"/>
        <!-- 加入ERROR紀錄檔輸出 -->
        <appender-ref ref="ERROR"/>
    </root>
</configuration>

啟動只有又會多一個service.log,如下

 

2、切面紀錄檔列印

可能有些同學不知道這個是啥,這裡我舉個場景,就好理解了。

假設現在的專案結構如下,增加了一個HttpAspect切面類,作用是監控controller中每個方法的入參、出參、介面耗時等資訊,這個功能相信大家都做過。

HttpAspect程式碼如下

package com.example.logback.config;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect
@Component
public class HttpAspect {

    @Pointcut("execution(* com.example.logback.controller..*.*(..))")
    public void pointCut() {

    }

    @Around(value = "pointCut()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

        // 獲取目標引數
        String serviceUniqueName = proceedingJoinPoint.getSignature().getDeclaringTypeName();
        String methodName = proceedingJoinPoint.getSignature().getName();
        long start = System.currentTimeMillis();
        Object proceed = proceedingJoinPoint.proceed();
        log.info("@Http:{}.{},耗時:{}ms", serviceUniqueName, methodName,
            System.currentTimeMillis() - start);
        return proceed;
    }
}
View Code

相信細心的同學已經發現問題了,controller目錄下的類裡面是沒有列印的,log都在config目錄下的HttpAspect中,顯然指定列印目錄為controller是不行的。

那如果指定目錄為config呢?如果這個目錄下只有一個HttpAspect類是可以的,但如果該目錄下還有其他設定類,那這個辦法就不太好用了。

這時我們就需要通過指定類的方式進行列印。

那怎麼指定類進行列印呢?我們常用的@Slf4j註解裡面有一個屬性topic

@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface Slf4j {
    /** @return The category of the constructed Logger. By default, it will use the type where the annotation is placed. */
    String topic() default "";
}

定義方式也很簡單,如下

這個topic定義之後,和logger中的name屬性對上之後,那麼這個logger就只會列印這個類的紀錄檔!!!

第一步、指定類定義topic

package com.example.logback.config;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Slf4j(topic = "http-log")
@Aspect
@Component
public class HttpAspect {

    @Pointcut("execution(* com.example.logback.controller..*.*(..))")
    public void pointCut() {

    }

    @Around(value = "pointCut()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

        // 獲取目標引數
        String serviceUniqueName = proceedingJoinPoint.getSignature().getDeclaringTypeName();
        String methodName = proceedingJoinPoint.getSignature().getName();
        long start = System.currentTimeMillis();
        Object proceed = proceedingJoinPoint.proceed();
        log.info("@Http:{}.{},耗時:{}ms", serviceUniqueName, methodName,
            System.currentTimeMillis() - start);
        return proceed;
    }
}

第二步、定義指定類topic的紀錄檔檔案輸出路徑 

<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定義應用名稱,區分應用 -->
    <property name="APP_NAME" value="logback-test"/>
    <!-- 定義紀錄檔檔案的輸出路徑 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    <!-- 定義紀錄檔檔名稱和路徑 -->
    <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
    <!-- 定義警告級別紀錄檔檔名稱和路徑 -->
    <property name="WARN_LOG_FILE" value="${LOG_PATH}/warn.log"/>
    <!-- 定義錯誤級別紀錄檔檔名稱和路徑 -->
    <property name="ERROR_LOG_FILE" value="${LOG_PATH}/error.log"/>
    <!-- 定義指定目錄service紀錄檔檔名稱和路徑 -->
    <property name="SERVICE_LOG_FILE" value="${LOG_PATH}/service.log"/>
    <!-- 定義指定目錄HTTP紀錄檔檔名稱和路徑 -->
    <property name="HTTP_PACKAGE_LOG_FILE" value="${LOG_PATH}/http-package.log"/>
    <!-- 定義指定類topic方式的紀錄檔檔名稱和路徑 -->
    <property name="HTTP_TOPIC_LOG_FILE" value="${LOG_PATH}/http-topic.log"/>

    <!-- 將紀錄檔卷動輸出到application.log檔案中 -->
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 輸出檔案目的地 -->
        <file>${LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 摘取出WARN級別紀錄檔輸出到warn.log中 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${WARN_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將WARN相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!-- 摘取出ERROR級別紀錄檔輸出到error.log中 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${ERROR_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將ERROR相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 定義指定目錄service的appender -->
    <appender name="SERVICE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${SERVICE_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/service.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 定義指定目錄HTTP-PACKAGE的appender -->
    <appender name="HTTP-PACKAGE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${HTTP_PACKAGE_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/http-package.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 設定掃描包路徑,追加紀錄檔到service的appender中 -->
    <!--若是additivity設為true,則子Logger不止會在自己的appender裡輸出,還會在root的logger的appender裡輸出-->
    <logger name="com.example.logback.service" level="INFO" additivity="true">
        <appender-ref ref="SERVICE"/>
    </logger>

    <!-- 設定掃描包路徑,追加紀錄檔到HTTP-PACKAGE的appender中 -->
    <!--若是additivity設為true,則子Logger不止會在自己的appender裡輸出,還會在root的logger的appender裡輸出-->
    <logger name="com.example.logback.config" level="INFO" additivity="false">
        <appender-ref ref="HTTP-PACKAGE"/>
    </logger>

    <!-- 設定輸出級別 -->
    <root level="INFO">
        <!-- 加入控制檯輸出 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 加入APPLICATION輸出 -->
        <appender-ref ref="APPLICATION"/>
        <!-- 加入WARN紀錄檔輸出 -->
        <appender-ref ref="WARN"/>
        <!-- 加入ERROR紀錄檔輸出 -->
        <appender-ref ref="ERROR"/>
    </root>
</configuration> 

第三步、定義指定類topic的appender

<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定義應用名稱,區分應用 -->
    <property name="APP_NAME" value="logback-test"/>
    <!-- 定義紀錄檔檔案的輸出路徑 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    <!-- 定義紀錄檔檔名稱和路徑 -->
    <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
    <!-- 定義警告級別紀錄檔檔名稱和路徑 -->
    <property name="WARN_LOG_FILE" value="${LOG_PATH}/warn.log"/>
    <!-- 定義錯誤級別紀錄檔檔名稱和路徑 -->
    <property name="ERROR_LOG_FILE" value="${LOG_PATH}/error.log"/>
    <!-- 定義指定目錄service紀錄檔檔名稱和路徑 -->
    <property name="SERVICE_LOG_FILE" value="${LOG_PATH}/service.log"/>
    <!-- 定義指定目錄HTTP紀錄檔檔名稱和路徑 -->
    <property name="HTTP_PACKAGE_LOG_FILE" value="${LOG_PATH}/http-package.log"/>
    <!-- 定義指定類topic方式的紀錄檔檔名稱和路徑 -->
    <property name="HTTP_TOPIC_LOG_FILE" value="${LOG_PATH}/http-topic.log"/>

    <!-- 將紀錄檔卷動輸出到application.log檔案中 -->
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 輸出檔案目的地 -->
        <file>${LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 摘取出WARN級別紀錄檔輸出到warn.log中 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${WARN_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將WARN相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!-- 摘取出ERROR級別紀錄檔輸出到error.log中 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${ERROR_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將ERROR相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 定義指定目錄service的appender -->
    <appender name="SERVICE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${SERVICE_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/service.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 定義指定目錄HTTP-PACKAGE的appender -->
    <appender name="HTTP-PACKAGE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${HTTP_PACKAGE_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/http-package.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 定義指定類topic的appender -->
    <appender name="HTTP-TOPIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${HTTP_TOPIC_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/http-topic.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 設定掃描包路徑,追加紀錄檔到service的appender中 -->
    <!--若是additivity設為true,則子Logger不止會在自己的appender裡輸出,還會在root的logger的appender裡輸出-->
    <logger name="com.example.logback.service" level="INFO" additivity="true">
        <appender-ref ref="SERVICE"/>
    </logger>

    <!-- 設定掃描包路徑,追加紀錄檔到HTTP-PACKAGE的appender中 -->
    <!--若是additivity設為true,則子Logger不止會在自己的appender裡輸出,還會在root的logger的appender裡輸出-->
    <logger name="com.example.logback.config" level="INFO" additivity="false">
        <appender-ref ref="HTTP-PACKAGE"/>
    </logger>

    <!-- 設定輸出級別 -->
    <root level="INFO">
        <!-- 加入控制檯輸出 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 加入APPLICATION輸出 -->
        <appender-ref ref="APPLICATION"/>
        <!-- 加入WARN紀錄檔輸出 -->
        <appender-ref ref="WARN"/>
        <!-- 加入ERROR紀錄檔輸出 -->
        <appender-ref ref="ERROR"/>
    </root>
</configuration>

第四步、追加紀錄檔到指定類topic的appender中

<configuration>
    <!-- 預設的一些設定 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定義應用名稱,區分應用 -->
    <property name="APP_NAME" value="logback-test"/>
    <!-- 定義紀錄檔檔案的輸出路徑 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    <!-- 定義紀錄檔檔名稱和路徑 -->
    <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
    <!-- 定義警告級別紀錄檔檔名稱和路徑 -->
    <property name="WARN_LOG_FILE" value="${LOG_PATH}/warn.log"/>
    <!-- 定義錯誤級別紀錄檔檔名稱和路徑 -->
    <property name="ERROR_LOG_FILE" value="${LOG_PATH}/error.log"/>
    <!-- 定義指定目錄service紀錄檔檔名稱和路徑 -->
    <property name="SERVICE_LOG_FILE" value="${LOG_PATH}/service.log"/>
    <!-- 定義指定目錄HTTP紀錄檔檔名稱和路徑 -->
    <property name="HTTP_PACKAGE_LOG_FILE" value="${LOG_PATH}/http-package.log"/>
    <!-- 定義指定類topic方式的紀錄檔檔名稱和路徑 -->
    <property name="HTTP_TOPIC_LOG_FILE" value="${LOG_PATH}/http-topic.log"/>

    <!-- 將紀錄檔卷動輸出到application.log檔案中 -->
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 輸出檔案目的地 -->
        <file>${LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 摘取出WARN級別紀錄檔輸出到warn.log中 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${WARN_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將WARN相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!-- 摘取出ERROR級別紀錄檔輸出到error.log中 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${ERROR_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 紀錄檔過濾器,將ERROR相關紀錄檔過濾出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- 設定控制檯輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 定義指定目錄service的appender -->
    <appender name="SERVICE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${SERVICE_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/service.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 定義指定目錄HTTP-PACKAGE的appender -->
    <appender name="HTTP-PACKAGE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${HTTP_PACKAGE_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/http-package.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 定義指定類topic的appender -->
    <appender name="HTTP-TOPIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${HTTP_TOPIC_LOG_FILE}</file>
        <encoder>
            <!-- 使用預設的輸出格式列印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 設定 RollingPolicy 屬性,用於組態檔大小限制,保留天數、檔名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 檔案命名格式 -->
            <fileNamePattern>${LOG_PATH}/http-topic.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 檔案保留最大天數 -->
            <maxHistory>7</maxHistory>
            <!-- 檔案大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 檔案總大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 設定掃描包路徑,追加紀錄檔到service的appender中 -->
    <!--若是additivity設為true,則子Logger不止會在自己的appender裡輸出,還會在root的logger的appender裡輸出-->
    <logger name="com.example.logback.service" level="INFO" additivity="true">
        <appender-ref ref="SERVICE"/>
    </logger>

    <!-- 設定掃描包路徑,追加紀錄檔到HTTP-PACKAGE的appender中 -->
    <!--若是additivity設為true,則子Logger不止會在自己的appender裡輸出,還會在root的logger的appender裡輸出-->
    <logger name="com.example.logback.config" level="INFO" additivity="false">
        <appender-ref ref="HTTP-PACKAGE"/>
    </logger>

    <!-- 設定掃描包路徑,追加紀錄檔到HTTP-TOPIC的appender中 -->
    <!--若是additivity設為true,則子Logger不止會在自己的appender裡輸出,還會在root的logger的appender裡輸出-->
    <logger name="http-log" level="INFO" additivity="false">
        <appender-ref ref="HTTP-TOPIC"/>
    </logger>


    <!-- 設定輸出級別 -->
    <root level="INFO">
        <!-- 加入控制檯輸出 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 加入APPLICATION輸出 -->
        <appender-ref ref="APPLICATION"/>
        <!-- 加入WARN紀錄檔輸出 -->
        <appender-ref ref="WARN"/>
        <!-- 加入ERROR紀錄檔輸出 -->
        <appender-ref ref="ERROR"/>
    </root>
</configuration>

 紀錄檔目錄中多了一個檔案,http-topic,如下

 

五、寫在最後

這篇文章篇幅比較長,主要是組態檔貼的比較多,我本來是想每一步只貼關鍵程式碼的,但成文之後看起來有點費勁,所以每一步都貼了全量的設定。xml檔案我覺得是比較難閱讀的一種檔案,裡面的標籤又多又亂,沒有順序可言。如果不是從第一個標籤開始看,根本不知道標籤之間的依賴關係,為了方便大家閱讀,我用了這種顏色表示新增的設定,這種顏色表示有關聯的設定,無色表示無關設定。不過我也不知道這種辦法能不能提高閱讀體驗,如果大家有好的想法也可以評論提出來,在此表示感謝!