概述
Logback是一個日志框架,Logback和Log4j都是開源的日志工具庫,Logback是Log4j的改良版本,內置實現(xiàn)了slf4j,比Log4j擁有更多的特性,性能也帶來很大提升。SpringBoot默認內置了Logback日志框架,Spring Boot 集成logback需要添加 spring-boot-starter-logging 依賴,而此依賴已經在 spring-boot-starter 中添加過了,所以不用再添加此依賴了
Log4j建議只使用四個級別,優(yōu)先級從高到低分別是 ERROR、WARN、INFO、DEBUG,優(yōu)先級高的將被打印出來。(logback通用)
通過定義級別,可以作為應用程序中相應級別的日志信息的開關。
- 比如在這里定義了INFO級別,則應用程序中所有DEBUG級別的日志信息將不被打印出來。(設置INFO級別,即:>=INFO 生效*
配置詳解
默認情況下,SpringBoot會用Logback來記錄日志,并用INFO級別輸出到控制臺。
configuration
根節(jié)點 <configuration> 下面包含三個屬性:
- scan: 當此屬性設置為true時,配置文件如果發(fā)生改變,將會被重新加載,默認值為true。
- scanPeriod: 設置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。
- debug: 當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態(tài)。默認值為false。示例:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--其他配置省略-->
</configuration>
appender
<appender>:負責謝日志的組件,它有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名。
ConsoleAppender
ConsoleAppender 把日志輸出到控制臺,有以下子節(jié)點:
<encoder> :對日志進行格式化
<target>:字符串System.out(默認)或者System.err
示例:把 >=DEBUG 級別的日志都輸出到控制臺
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
FileAppender
<FileAppender>:把日志添加到文件,有以下子節(jié)點:
-
<file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創(chuàng)建,沒有默認值。 -
<append>:如果是 true,日志被追加到文件結尾,如果是 false,清空現(xiàn)存文件,默認是true。 -
<encoder>:對記錄事件進行格式化。(具體參數(shù)稍后講解 ) -
<prudent>:如果是 true,日志會被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認是 false。
示例:把 >= DEBUG 級別的日志都輸出到 testFile.log 文件:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
RollingFileAppender
<RollingFileAppender> :滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其它文件。有以下子節(jié)點:
-
<file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創(chuàng)建,沒有默認值。 -
<append>:如果是 true,日志被追加到文件結尾,如果是 false,清空現(xiàn)存文件,默認是true。 -
<rollingPolicy>: 當發(fā)生滾動時,決定RollingFileAppender的行為,涉及文件移動和重命名。屬性class定義具體的滾動策略類
TimeBasedRollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy: 最常用的滾動策略,它根據(jù)時間來制定滾動策略,既負責滾動也負責出發(fā)滾動。有以下子節(jié)點:
- :必要節(jié)點,包含文件名及“%d”轉換符,“%d”可以包含一個java.text.SimpleDateFormat指定的時間格式,如:%d{yyyy-MM}。
如果直接使用 %d,默認格式是 yyyy-MM-dd。RollingFileAppender的file字節(jié)點可有可無,通過設置file,可以為活動文件和歸檔文件指定不同位置,當前日志總是記錄到file指定的文件(活動文件),活動文件的名字不會改變;
如果沒設置file,活動文件的名字會根據(jù)fileNamePattern 的值,每隔一段時間改變一次?!?”或者“\”會被當做目錄分隔符。 - : 可選節(jié)點,控制保留的歸檔文件的最大數(shù)量,超出數(shù)量就刪除舊文件。假設設置每個月滾動,且是6,則只保存最近6個月的文件,刪除之前的舊文件。注意,刪除舊文件是,那些為了歸檔而創(chuàng)建的目錄也會被刪除。
SizeBasedTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy : 查看當前活動文件的大小,如果超過指定大小會告知RollingFileAppender 觸發(fā)當前活動文件滾動。只有一個節(jié)點:
- : 這是活動文件的大小,默認值是10MB。
- :當為true時,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有兩個限制,1不支持也不允許文件壓縮,2不能設置file屬性,必須留空。
- : 告知 RollingFileAppender 合適激活滾動。
FixedWindowRollingPolicy
class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy 根據(jù)固定窗口算法重命名文件的滾動策略。有以下子節(jié)點:
- : 窗口索引最小值
- : 窗口索引最大值,當用戶指定的窗口過大時,會自動將窗口設置為12。
- : 必須包含“%i”例如,假設最小值和最大值分別為1和2,命名模式為 mylog%i.log,會產生歸檔文件mylog1.log和mylog2.log。還可以指定文件壓縮選項,例如,mylog%i.log.gz 或者 沒有l(wèi)og%i.log.zip
示例:每天生成一個日志文件,保存30天的日志文件:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
<logger>
<logger> :用來設置某一個包或具體的某一個類的日志打印級別、以及指定。
```: 僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
可以包含零個或多個元素,標識這個appender將會添加到這個logger。
- name: 用來指定受此loger約束的某一個包或者具體的某一個類。
- level: 用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,還有一個特殊值INHERITED或者同義詞NULL,代表強制執(zhí)行上級的級別。 如果未設置此屬性,那么當前l(fā)oger將會繼承上級的級別。
- addtivity: 是否向上級logger傳遞打印信息。默認是true??梢园銈€或多個元素,標識這個appender將會添加到這個logger。
<root>
子節(jié)點:它也是元素,但是它是根loger,是所有的上級。只有一個level屬性,因為name已經被命名為"root",且已經是最上級了。
level: 用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,不能設置為INHERITED或者同義詞NULL。 默認是DEBUG。
同一樣,可以包含零個或多個元素,標識這個appender將會添加到這個logger。
示例:常用logger配置:
<!-- show parameters for hibernate sql 專為 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.type" level="TRACE" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<contextName>
子節(jié)點:用來設置上下文名稱,每個logger都關聯(lián)到logger上下文,默認上下文名稱為default。但可以使用設置成其他名字,用于區(qū)分不同應用程序的記錄。一旦設置,不能修改。
示例:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>myAppName</contextName>
<!--其他配置省略-->
</configuration>
<property>
子節(jié)點 :用來定義變量值,它有兩個屬性name和value,通過定義的值會被插入到 logger 上下文中,可以通過 ${} 來使用變量。
name: 變量的名稱
value: 的值時變量定義的值
示例:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_Name" value="myAppName" />
<contextName>${APP_Name}</contextName>
<!--其他配置省略-->
</configuration>
<timestamp>
子節(jié)點 :獲取時間戳字符串,他有兩個屬性key和datePattern。
key: 標識此 的名字;
datePattern: 設置將當前時間(解析配置文件的時間)轉換為字符串的模式,遵循java.txt.SimpleDateFormat的格式。
示例:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<contextName>${bySecond}</contextName>
<!-- 其他配置省略-->
</configuration>
完整配置demo
示例一
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定義日志文件的存儲地址,如果是在window中可以使用/開頭的絕對地址,在linux中不要使用 / 開頭的地址,因為其表示絕對地址,linux中要使用相對地址時 不要以 盤符開頭即可-->
<property name="logPath" value="/logs" />
<!--日志文件保留天數(shù),最長支持30天-->
<property name="MaxHistory" value="30"/>
<!--日志文件最大的大小,支持KB,MB-->
<property name="MaxFileSize" value="100MB"/>
<!--控制臺日志, 控制臺輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度,%msg:日志消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--文件日志, 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件輸出的文件名-->
<FileNamePattern>${logPath}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天數(shù)-->
<MaxHistory>${MaxHistory}</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>${MaxFileSize}</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- show parameters for hibernate sql 專為 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.type" level="TRACE" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
<!--mybatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 日志輸出級別 -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE"/>
</root>
<!-- 根據(jù)不同環(huán)境配置不同日志輸出 -->
<springProfile name="local">
<root level="debug">
<appender-ref ref="console" />
</root>
</springProfile>
<!--開發(fā)環(huán)境:打印控制臺-->
<springProfile name="dev">
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE"/>
</root>
</springProfile>
<!-- test,pro 環(huán)境 -->
<springProfile name="test,pro">
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE"/>
</root>
</springProfile>
</configuration>
折疊
示例二:過濾掉某些級別的信息
我們把debug,error,info等級別的日志,都分開,分別打印輸出在不同的文件中。
需要做的就是,在不同的 日志級別中 過濾掉即可。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- 控制臺輸出日志 -->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d - %msg%n <!-- 控制臺打印日志文件體 時間-信息 -->
</pattern>
</layout>
</appender>
<!-- 輸出info級別的日志 -->
<appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 在info中過濾掉掉 error 級別的信息 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch> <!-- 如果命中就禁止這條日志 -->
<onMismatch>ACCEPT</onMismatch> <!-- 如果沒有命中就使用這條規(guī)則 -->
</filter>
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!-- 滾動策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 設置info日志路徑 -->
<fileNamePattern>E:\\IntelliJ IDEA\\logback\\info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!-- 輸出error級別的日志 -->
<appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 過濾日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!-- 滾動策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 設置error日志路徑 -->
<fileNamePattern>E:\\IntelliJ IDEA\\logback\\error.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!-- 設置默認日志級別為INFO,一般都設置為info -->
<root level="info">
<appender-ref ref="consoleLog"/>
<appender-ref ref="infoLog"/>
<appender-ref ref="errorLog"/>
</root>
</configuration>
折疊
可以結合示例一進行優(yōu)化。
示例三:自動壓縮存儲按照日期分割后的日志異步寫入
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- 項目名稱 -->
<property name="PROJECT_NAME" value="small-and-beautiful-blog" />
<!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
<property name="LOG_HOME" value="./logs" />
<!-- 控制臺輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>false</withJansi>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化輸出: %d: 日期; %-5level: 級別從左顯示5個字符寬度; %thread: 線程名; %logger: 類名; %M: 方法名; %line: 行號; %msg: 日志消息; %n: 換行符 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- ERROR日志文件,記錄錯誤日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${PROJECT_NAME}/error.log</file>
<!-- 過濾器,只打印ERROR級別的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件輸出的文件名-->
<FileNamePattern>${LOG_HOME}/${PROJECT_NAME}/%d{yyyy-MM-dd}/error.%i.zip</FileNamePattern>
<!--日志文件保留天數(shù)-->
<MaxHistory>3650</MaxHistory>
<!--日志文件最大的大小-->
<MaxFileSize>100MB</MaxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化輸出: %d: 日期; %-5level: 級別從左顯示5個字符寬度; %thread: 線程名; %logger: 類名; %M: 方法名; %line: 行號; %msg: 日志消息; %n: 換行符 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- INFO日志文件,用于記錄重要日志信息 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${PROJECT_NAME}/info.log</file>
<!-- 過濾器,只打印INFO級別的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件輸出的文件名-->
<FileNamePattern>${LOG_HOME}/${PROJECT_NAME}/%d{yyyy-MM-dd}/info.%i.zip</FileNamePattern>
<!--日志文件保留天數(shù)-->
<MaxHistory>3650</MaxHistory>
<!--日志文件最大的大小-->
<MaxFileSize>100MB</MaxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化輸出: %d: 日期; %-5level: 級別從左顯示5個字符寬度; %thread: 線程名; %logger: 類名; %M: 方法名; %line: 行號; %msg: 日志消息; %n: 換行符 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 打印的SQL日志文件,用于執(zhí)行的SQL語句和參數(shù)信息 -->
<appender name="SQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${PROJECT_NAME}/sql.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件輸出的文件名-->
<FileNamePattern>${LOG_HOME}/${PROJECT_NAME}/%d{yyyy-MM-dd}/sql.%i.zip</FileNamePattern>
<!--日志文件保留天數(shù)-->
<MaxHistory>3650</MaxHistory>
<!--日志文件最大的大小-->
<MaxFileSize>100MB</MaxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化輸出: %d: 日期; %-5level: 級別從左顯示5個字符寬度; %thread: 線程名; %logger: 類名; %M: 方法名; %line: 行號; %msg: 日志消息; %n: 換行符 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- API請求被訪問的日志文件,記錄請求的URL和攜帶的參數(shù) -->
<appender name="REQUEST_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${PROJECT_NAME}/request.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件輸出的文件名-->
<FileNamePattern>${LOG_HOME}/${PROJECT_NAME}/%d{yyyy-MM-dd}/request.%i.zip</FileNamePattern>
<!--日志文件保留天數(shù)-->
<MaxHistory>3650</MaxHistory>
<!--日志文件最大的大小-->
<MaxFileSize>100MB</MaxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化輸出: %d: 日期; %-5level: 級別從左顯示5個字符寬度; %thread: 線程名; %logger: 類名; %M: 方法名; %line: 行號; %msg: 日志消息; %n: 換行符 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 異步輸出INFO_FILE -->
<appender name="ASYNC_INFO_FILE" class="ch.qos.logback.classic.AsyncAppender">
<!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 -->
<queueSize>256</queueSize>
<!-- 默認情況下,當阻塞隊列的剩余容量為20%時,它將丟棄TRACE,DEBUG和INFO級別的事件,僅保留WARN和ERROR級別的事件。要保留所有事件,請將discardingThreshold設置為0。 -->
<discardingThreshold>0</discardingThreshold>
<!-- 添加附加的appender,使用前面定義的name,最多只能添加一個 -->
<appender-ref ref="INFO_FILE"/>
</appender>
<!-- 異步輸出ERROR_FILE -->
<appender name="ASYNC_ERROR_FILE" class="ch.qos.logback.classic.AsyncAppender">
<!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 -->
<queueSize>256</queueSize>
<!-- 默認情況下,當阻塞隊列的剩余容量為20%時,它將丟棄TRACE,DEBUG和INFO級別的事件,僅保留WARN和ERROR級別的事件。要保留所有事件,請將discardingThreshold設置為0。 -->
<discardingThreshold>0</discardingThreshold>
<!-- 添加附加的appender,使用前面定義的name,最多只能添加一個 -->
<appender-ref ref="ERROR_FILE"/>
</appender>
<!-- 異步輸出SQL_FILE -->
<appender name="ASYNC_SQL_FILE" class="ch.qos.logback.classic.AsyncAppender">
<!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 -->
<queueSize>256</queueSize>
<!-- 默認情況下,當阻塞隊列的剩余容量為20%時,它將丟棄TRACE,DEBUG和INFO級別的事件,僅保留WARN和ERROR級別的事件。要保留所有事件,請將discardingThreshold設置為0。 -->
<discardingThreshold>0</discardingThreshold>
<!-- 添加附加的appender,使用前面定義的name,最多只能添加一個 -->
<appender-ref ref="SQL_FILE"/>
</appender>
<!-- 異步輸出REQUEST_FILE -->
<appender name="ASYNC_REQUEST_FILE" class="ch.qos.logback.classic.AsyncAppender">
<!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 -->
<queueSize>256</queueSize>
<!-- 默認情況下,當阻塞隊列的剩余容量為20%時,它將丟棄TRACE,DEBUG和INFO級別的事件,僅保留WARN和ERROR級別的事件。要保留所有事件,請將discardingThreshold設置為0。 -->
<discardingThreshold>0</discardingThreshold>
<!-- 添加附加的appender,使用前面定義的name,最多只能添加一個 -->
<appender-ref ref="REQUEST_FILE"/>
</appender>
<!-- 輸出error信息到文件-->
<logger name="error" additivity="true">
<appender-ref ref="ERROR_FILE"/>
</logger>
<!-- 輸出info信息到文件-->
<logger name="info" additivity="true">
<appender-ref ref="INFO_FILE"/>
</logger>
<!-- 輸出request信息到文件-->
<logger name="request" level="INFO" additivity="false">
<appender-ref ref="REQUEST_FILE" />
</logger>
<!-- 輸出SQL到控制臺和文件-->
<logger name="org.hibernate.SQL" additivity="false">
<level value="DEBUG" />
<appender-ref ref="SQL_FILE" />
</logger>
<!-- 輸出SQL的參數(shù)到控制臺和文件-->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" additivity="false" level="TRACE">
<level value="TRACE" />
<appender-ref ref="SQL_FILE" />
</logger>
<!-- 開發(fā)環(huán)境下的日志配置 -->
<springProfile name="dev">
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="INFO_FILE" />
</root>
</springProfile>
<!-- 測試環(huán)境下的日志配置 -->
<springProfile name="test">
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="INFO_FILE" />
</root>
</springProfile>
<!-- 生產環(huán)境下的日志配置 -->
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="INFO_FILE" />
</root>
</springProfile>
</configuration>
折疊
在application.properties中通過 logging.config=classpath:xxx.xml 來指定配置文件