Spring Boot logback日誌配置

回家嗎發表於2020-11-19

前言

SLF4J,即簡單日誌門面(Simple Logging Facade for Java)。從設計模式的角度考慮,它是用來在log和程式碼層之間起到門面的作用。配置SLF4J是非常簡單的一件事,只要將你打算使用的日誌系統對應的jar包加入到專案中,SLF4J就會自動選擇使用你加入的日誌系統。使用slf4j提供的介面,可隱藏日誌的具體實現。這與jdbc相似,使用jdbc也就避免了不同的具體資料庫。

SLF4J所提供的核心API是一些介面以及一個LoggerFactory的工廠類,SLF4J提供了統一的記錄日誌的介面,只要按照其提供的方法記錄即可,最終日誌的格式、記錄級別、輸出方式等通過具體日誌系統的配置來實現,因為在程式碼實現中用的是介面,因此可以在應用中靈活切換日誌系統。

目前來說,Logback是SLF4J的最佳實現。

對於Log4j , JDK logging, tinylog 等工具, 需要一個適配層, 把SLF4J 的API轉化成具體工具的呼叫介面。由於Logback這個工具直接實現了SLF4J的API,所以連適配層都不需要了, 用起來速度飛快,效率最高,SLFJ4+Logback 成為了很多人的最愛
在這裡插入圖片描述

預設日誌Logback

預設情況下,Spring Boot會用Logback來記錄日誌,並用INFO級別輸出到控制檯

但是呢,實際開發中我們不需要直接新增該依賴。 你會發現spring-boot-starter其中包含了
spring-boot-starter-logging,該依賴內容就是 Spring Boot 預設的日誌框架
logback。工程中有用到了Thymeleaf,而Thymeleaf依賴包含了spring-boot-starter,最終我只要引入Thymeleaf即可。

在新建的springboot專案或是開源專案執行時,就會看到日誌輸出:
這就是springboot預設的日誌輸出,檢視原始碼可知,預設配置為org/springframework/boot/logging/logback/base.xml的日誌配置:

//base.xml
<included>
	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
	<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
	<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
	<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	</root>
</included>
 
// defaults.xml
<included>
   # 定義顯示顏色
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    # 定義預設控制檯輸出日誌輸出格式
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    # 定義預設日誌檔案輸出格式
    <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR" />
    <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR" />
    <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN" />
    <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN" />
    <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN" />
    <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR" />
    <logger name="org.hibernate.validator.internal.util.Version" level="WARN" />
</included>
 
//console-appender.xml
<included>
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
		</encoder>
	</appender>
</included>
 
//file-appender.xml
<included>
	<appender name="FILE"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<encoder>
			<pattern>${FILE_LOG_PATTERN}</pattern>
		</encoder>
		<file>${LOG_FILE}</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
		 <!-- 新增.gz 歷史日誌會啟用壓縮 大大縮小日誌檔案所佔空間 -->
			<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
			<maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
			<maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
		</rollingPolicy>
	</appender>
</included>

日誌級別

SpringBoot支援6種日誌級別(常用的只有四種),預設級別為INFO,比設定級別低的日誌資訊均不會輸出,按優先順序別排序如下:

TRACE < DEBUG < INFO < WARN < ERROR < FATAL

可以設定級別為DEBUG來啟用除錯模式(通常開發時使用),正常程式執行的每條日誌都會輸出

日誌輸出方式

預設情況下,Spring Boot將日誌輸出到控制檯,不會寫到日誌檔案

  • 控制檯輸出,只在控制檯(console)中列印出日誌。
  • 檔案輸出,將輸出的日誌儲存到檔案中。通常會自定義配置日誌輸出的檔案的儲存路徑,檔案命名格式,日誌格式等(更多時還需要區分日誌級別,每天產生一個日誌檔案等)。

自定義日誌配置

根據不同的日誌系統,你可以按如下規則組織配置檔名,就能被正確載入:

  • Logback:logback-spring.xml, logback-spring.groovy, logback.xml,
    logback.groovy
  • Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties,
    log4j.xml Log4j2:log4j2-spring.xml, log4j2.xml
  • JDK (Java Util Logging):logging.properties

Spring Boot官方推薦優先使用帶有-spring的檔名作為你的日誌配置(如使用logback-spring.xml,而不是logback.xml),命名為logback-spring.xml的日誌配置檔案,spring boot可以為它新增一些spring boot特有的配置項(下面會提到)。
預設的命名規則,並且放在 src/main/resources 下面即可

如果你即想完全掌控日誌配置,但又不想用logback.xml作為Logback配置的名字,application.yml/application.properties裡面可以通過logging.config屬性指定自定義的名字:

logging.config=file:config/logging-config.xml

這樣可以吧配置檔案放在config資料夾下統一管理

[admin@custmer-development-d-031162 salaxy_8074]$ ll
total 122148
-rw-r--r--. 1 admin admin         5 Aug 25 15:04 application.pid
-rw-r--r--. 1 admin admin         4 Aug 25 15:04 application.port
drwxr-xr-x. 2 admin admin        93 Aug 25 15:04 bak
drwxr-xr-x. 2 admin admin        93 Nov 18 23:48 config
-rwxr-xr-x. 1 admin admin       108 Aug 25 15:04 run.sh
-rw-r--r--. 1 admin admin 125064890 Aug 25 15:04 SpringBootdemo-2.0.jar
[admin@custmer-development-d-031162 salaxy_8074]$ ll config/
total 16
-rw-r--r--. 1 admin admin 10618 Aug 25 15:04 application-dev.properties
-rw-r--r--. 1 admin admin  1203 Aug 25 15:04 application.properties
-rw-r--r--. 1 admin admin     0 Nov 18 23:48 logback-spring.xml

示例一

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 日誌儲存路徑,可以是絕對路徑,也可以是相對路徑,
    logback會自動建立資料夾,這樣設定了就可以輸出日誌檔案了  -->
    <substitutionProperty name="logbase" value="${LOG_PATH}"/>
    <!-- 這個是要配置輸出檔案的 -->
    <!-- ConsoleAppender 控制檯輸出日誌 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 對日誌進行格式化 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n</pattern>
        </encoder>
    </appender>
    <!-- ERROR級別日誌 -->
    <!-- 滾動記錄檔案,先將日誌記錄到指定檔案,當符合某個條件時,將日誌記錄到其他檔案 RollingFileAppender-->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 過濾器,只記錄WARN級別的日誌 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <!-- 最常用的滾動策略,它根據時間來制定滾動策略.既負責滾動也負責出發滾動 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日誌輸出位置  可相對、和絕對路徑 -->
            <fileNamePattern>${logbase}%d{yyyy-MM-dd}/error%i.log</fileNamePattern>
            <!--日誌最多保留5天,單個檔案最大20mb,該型別日誌檔案一共不能超過400mb-->
            <MaxHistory>5</MaxHistory>
            <maxFileSize>20MB</maxFileSize>
            <totalSizeCap>400MB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- INFO級別日誌 appender -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 過濾器,只記錄INFO級別的日誌 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 按天回滾 daily -->
            <fileNamePattern>${logbase}%d{yyyy-MM-dd}/info%i.log</fileNamePattern>
            <MaxHistory>5</MaxHistory>
            <maxFileSize>20MB</maxFileSize>
            <totalSizeCap>400MB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
    </appender>


    <!-- DEBUG級別日誌 appender -->
    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 過濾器,只記錄DEBUG級別的日誌 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 按天回滾 daily -->
            <fileNamePattern>${logbase}%d{yyyy-MM-dd}/debug%i.log</fileNamePattern>
            <MaxHistory>5</MaxHistory>
            <maxFileSize>20MB</maxFileSize>
            <totalSizeCap>400MB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- root級別  info將會遮蔽debug級別的日誌 -->
    <root level="info">
        <!-- 控制檯輸出 -->
        <appender-ref ref="STDOUT"/>
        <!-- 檔案輸出 -->
        <appender-ref ref="ERROR"/>
        <appender-ref ref="INFO"/>
        <appender-ref ref="DEBUG"/>
    </root>
</configuration>

示例二

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    <!--<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } -&#45;&#45; [%t] %-40.40logger{39} : %m%nseqId:%X{log_seqId}&#45;&#45;${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSSZ} seqId : [%X{log_seqId}] %-5level %logger{20} - %msg%n</pattern>
        </encoder>
        <file>${LOG_PATH}/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
            <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- 非同步輸出 -->
    <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丟失日誌.預設的,如果佇列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌 -->
        <discardingThreshold>20</discardingThreshold>
        <!-- 更改預設的佇列的深度,該值會影響效能.預設值為256 -->
        <queueSize>512</queueSize>
        <!-- 新增附加的appender,最多隻能新增一個 -->
        <appender-ref ref ="FILE"/>
    </appender>

    <logger name="org.apache.kafka.common.network" level="ERROR" additivity="false">
        <appender-ref ref="FILE"/>
    </logger>

    <springProfile name="default">
        <root>
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>
    <springProfile name="dev">
        <root>
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="ASYNC_FILE"/>
        </root>
    </springProfile>

</configuration>

示例三

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

    <!-- 配置IP地址 -->
    <conversionRule conversionWord="ip" converterClass="com.xyk.util.log4j.IpConvert" />
    <!-- Console 輸出格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%date{yyyy-MM-dd HH:mm:ss} %boldGreen(%ip) | %highlight(%-5level) | %boldYellow(%thread) | %boldGreen(%logger) | %msg%n"/>

    <!-- 檔案輸出格式 -->
    <property name="FILE_LOG_PATTERN"
              value="===%d{yyyy-MM-dd HH:mm:ss.SSS} %ip %-5level %logger Line:%-3L - %msg%n"/>

    <!-- Console 輸出設定 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                ${CONSOLE_LOG_PATTERN}
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!--此日誌appender是為開發使用,只配置最底級別,控制檯輸出的日誌級別是大於或等於此級別的日誌資訊-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
    </appender>

    <!--
       說明:
       1、日誌級別及檔案
           日誌記錄採用分級記錄,級別與日誌檔名相對應,不同級別的日誌資訊記錄到不同的日誌檔案中
           例如:error級別記錄到log_error_xxx.log或log_error.log(該檔案為當前記錄的日誌檔案),而log_error_xxx.log為歸檔日誌,
           日誌檔案按日期記錄,同一天內,若日誌檔案大小等於或大於2M,則按0、1、2...順序分別命名
           例如log-level-2013-12-21.0.log
           其它級別的日誌也是如此。
       2、檔案路徑
           若開發、測試用,在Eclipse中執行專案,則到Eclipse的安裝路徑查詢logs資料夾,以相對路徑../logs。
           若部署到Tomcat下,則在Tomcat下的logs檔案中
       3、Appender
           FILEERROR對應error級別,檔名以log-error-xxx.log形式命名
           FILEWARN對應warn級別,檔名以log-warn-xxx.log形式命名
           FILEINFO對應info級別,檔名以log-info-xxx.log形式命名
           FILEDEBUG對應debug級別,檔名以log-debug-xxx.log形式命名
           stdout將日誌資訊輸出到控制上,為方便開發測試使用
    -->
    <contextName>SpringBootDemo</contextName>
    <property name="LOG_PATH" value="log/" />
    <!--設定系統日誌目錄-->
    <property name="APPDIR" value="pay-server" />

    <!-- 日誌記錄器,日期滾動記錄 -->
    <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌檔案的路徑及檔名 -->
        <file>${LOG_PATH}/${APPDIR}/log_error.log</file>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
            而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日誌記錄之外,還配置了日誌檔案不能超過2M,若超過2M,日誌檔案會以索引0開始,
            命名日誌檔案,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式記錄日誌 -->
        <append>true</append>
        <!-- 日誌檔案的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日誌檔案只記錄error級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 日誌記錄器,日期滾動記錄 -->
    <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌檔案的路徑及檔名 -->
        <file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
            而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日誌記錄之外,還配置了日誌檔案不能超過2M,若超過2M,日誌檔案會以索引0開始,
            命名日誌檔案,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式記錄日誌 -->
        <append>true</append>
        <!-- 日誌檔案的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日誌檔案只記錄warn級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 日誌記錄器,日期滾動記錄 -->
    <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌檔案的路徑及檔名 -->
        <file>${LOG_PATH}/${APPDIR}/log_info.log</file>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
            而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日誌記錄之外,還配置了日誌檔案不能超過2M,若超過2M,日誌檔案會以索引0開始,
            命名日誌檔案,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式記錄日誌 -->
        <append>true</append>
        <!-- 日誌檔案的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日誌檔案只記錄info級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <logger name="org.springframework" level="WARN" />
    <logger name="org.hibernate" level="WARN" />

    <!-- 生產環境下,將此級別配置為適合的級別,以免日誌檔案太多或影響程式效能 -->
    <!--這裡改level 生產環境改成ERROR 開發環境為INFO-->
    <root level="INFO">
        <appender-ref ref="FILEERROR" />
        <appender-ref ref="FILEWARN" />
        <appender-ref ref="FILEINFO" />

        <!-- 生產環境將請stdout,testfile去掉 -->
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

示例四

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<contextName>logback</contextName>
    <springProperty scope="context" name="app_name" source="spring.application.name"/>
	<springProfile name="test"><!-- 如果不同環境日誌存放路徑相同,無需套上springProfile節點 -->
		<property name="log.path" value="D:\\test\\" /><!-- 可以放在.properties檔案裡配置 -->
	</springProfile>
	<springProfile name="prod">
		<property name="log.path" value="D:\\prod\\" />
	</springProfile>
	<!-- 控制檯輸出 -->
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} %contextName [${app_name:-}] [%thread] %-5level %logger{36} - %msg%n </pattern>
		</encoder>
	</appender>
	
	<!-- 不帶過濾器,能記錄所有級別的日誌 -->
	<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<File>${log.path}/info.log</File>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 策略在每次往日誌中新增新內容時觸發,如果滿足條件(每分鐘對應一個日誌檔案),就將
				info.log複製到${log.path}目錄並更名為info-2017-11-22_13-15.1.log,並刪除原info.log,
				另一種生成新檔案的條件是,info.log大小大於maxFileSize時,如果當前這一分鐘已經有一個檔案了,
				則i加1。通常情況下,日誌按天分割,如:${log.path}/info-%d{yyyyMMdd}.%i.log -->
			<fileNamePattern>${log.path}/info-%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
				<maxFileSize>10MB</maxFileSize>  
			</timeBasedFileNamingAndTriggeringPolicy>
			<maxHistory>60</maxHistory>
			<totalSizeCap>20GB</totalSizeCap>
		</rollingPolicy>
		<layout class="ch.qos.logback.classic.PatternLayout">
			<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n </pattern>
		</layout>
	</appender>
 
	<!-- error級別的檔案輸出 -->
	<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>ERROR</level>
		</filter>
		<File>${log.path}/error.log</File>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.path}/error-%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
				<maxFileSize>10MB</maxFileSize>  
			</timeBasedFileNamingAndTriggeringPolicy>
			<maxHistory>60</maxHistory>
			<totalSizeCap>20GB</totalSizeCap>
		</rollingPolicy>
		<layout class="ch.qos.logback.classic.PatternLayout">
			<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n </pattern>
		</layout>
	</appender>
	<root level="info">
		<appender-ref ref="STDOUT" />
		<appender-ref ref="INFO_FILE" />
		<appender-ref ref="ERROR_FILE" />
	</root>
	
	<springProfile name="dev">
		<logger name="com" level="DEBUG" additivity="false">
			<appender-ref ref="STDOUT" />
<!-- 			<appender-ref ref="INFO_FILE" />
			<appender-ref ref="ERROR_FILE" /> -->
		</logger>
	</springProfile>
	
	<springProfile name="test,prod">
		<logger name="com" level="INFO" additivity="false">
			<appender-ref ref="INFO_FILE" />
			<appender-ref ref="ERROR_FILE" />
		</logger>
	</springProfile>
 
</configuration>

示例五

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
 
    <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
    <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
    <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
    <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
    <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
    <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
    <logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
 
 
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
 
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
 
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
             <!-- 新增.gz 歷史日誌會啟用壓縮 大大縮小日誌檔案所佔空間 -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
            <maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
            <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
        </rollingPolicy>
    </appender>
 
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
 
</configuration>

根節點包含的屬性

  • scan:當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。
  • scanPeriod:設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。
  • debug:當此屬性設定為true時,將列印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。

contextName設定上下文名稱

每個logger都關聯到logger上下文,預設上下文名稱為“default”。但可以使用設定成其他名字,用於區分不同應用程式的記錄。一旦設定,不能修改,可以通過%contextName來列印日誌上下文名稱,一般來說我們不用這個屬性,可有可無。

<property> 設定變數

用來定義變數值的標籤, 有兩個屬性,name和value;其中name的值是變數的名稱,value的值時變數定義的值。通過定義的值會被插入到logger上下文中。定義變數後,可以使“${}”來使用變數。

root節點是必選節點

用來指定最基礎的日誌輸出級別,只有一個level屬性。

level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設定為INHERITED或者同義詞NULL。
預設是DEBUG。
可以包含零個或多個元素,標識這個appender將會新增到這個loger。

控制檯輸出ConsoleAppender

日誌輸出到檔案RollingFileAppender

另一種常見的日誌輸出到檔案,隨著應用的執行時間越來越長,日誌也會增長的越來越多,將他們輸出到同一個檔案並非一個好辦法。RollingFileAppender用於切分檔案日誌:

<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!--如果只是想要 Info 級別的日誌,只是過濾 info 還是會輸出 Error 日誌,因為 Error 的級別高,
    所以我們使用下面的策略,可以避免輸出 Error 的日誌-->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <!--過濾 Error-->
        <level>ERROR</level>
        <!--匹配到就禁止-->
        <onMatch>DENY</onMatch>
        <!--沒有匹配到就允許-->
        <onMismatch>ACCEPT</onMismatch>
    </filter>
    <!--日誌名稱,如果沒有File 屬性,那麼只會使用FileNamePattern的檔案路徑規則
        如果同時有<File><FileNamePattern>,那麼當天日誌是<File>,明天會自動把今天
        的日誌改名為今天的日期。即,<File> 的日誌都是當天的。
    -->
    <File>${logback.logdir}/info.${logback.appname}.log</File>
    <!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--檔案路徑,定義了日誌的切分方式——把每一天的日誌歸檔到一個檔案中,以防止日誌填滿整個磁碟空間-->
        <FileNamePattern>${logback.logdir}/info.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
        <!--只保留最近90天的日誌-->
        <maxHistory>90</maxHistory>
        <!--用來指定日誌檔案的上限大小,那麼到了這個值,就會刪除舊的日誌-->
        <!--<totalSizeCap>1GB</totalSizeCap>-->
    </rollingPolicy>
    <!--日誌輸出編碼格式化-->
    <encoder>
        <charset>UTF-8</charset>
        <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
    </encoder>
</appender>


<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!--如果只是想要 Error 級別的日誌,那麼需要過濾一下,預設是 info 級別的,ThresholdFilter-->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>Error</level>
    </filter>
    <!--日誌名稱,如果沒有File 屬性,那麼只會使用FileNamePattern的檔案路徑規則
        如果同時有<File><FileNamePattern>,那麼當天日誌是<File>,明天會自動把今天
        的日誌改名為今天的日期。即,<File> 的日誌都是當天的。
    -->
    <File>${logback.logdir}/error.${logback.appname}.log</File>
    <!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--檔案路徑,定義了日誌的切分方式——把每一天的日誌歸檔到一個檔案中,以防止日誌填滿整個磁碟空間-->
        <FileNamePattern>${logback.logdir}/error.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
        <!--只保留最近90天的日誌-->
        <maxHistory>90</maxHistory>
        <!--用來指定日誌檔案的上限大小,那麼到了這個值,就會刪除舊的日誌-->
        <!--<totalSizeCap>1GB</totalSizeCap>-->
    </rollingPolicy>
    <!--日誌輸出編碼格式化-->
    <encoder>
        <charset>UTF-8</charset>
        <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
    </encoder>
</appender>

encoder 表示對日誌進行編碼:

%d{HH: mm:ss.SSS}——日誌輸出時間
%thread——輸出日誌的程式名字,這在Web應用以及非同步任務處理中很有用
%-5level——日誌級別,並且使用5個字元靠左對齊
%logger{36}——日誌輸出者的名字
%msg——日誌訊息
%n——平臺的換行符

ThresholdFilter系統定義的攔截器

我們用ThresholdFilter來過濾掉XXX level級別以下的日誌不輸出到檔案中。如果不用記得註釋掉,不然你控制檯會發現沒日誌~

loger

用來設定某一個包或者具體的某一個類的日誌列印級別、以及指定。僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。

name:用來指定受此loger約束的某一個包或者具體的某一個類。
level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設定此屬性,那麼當前loger將會繼承上級的級別。
addtivity:是否向上級loger傳遞列印資訊。預設是true。

appender

appender用來格式化日誌輸出節點,有倆個屬性name和class,class用來指定哪種輸出策略,常用就是控制檯輸出策略和檔案輸出策略。

參考博文(若侵刪):
https://blog.csdn.net/Inke88/article/details/75007649
http://blog.csdn.net/zhuyucheng123/article/details/21524529
https://blog.csdn.net/qq_22177809/article/details/82763085

相關文章