參考官方日志文檔鏈接1
參考官方日志文檔鏈接2
http://www.51gjie.com/javaweb/1096.html
1.日志框架基本介紹
常見的日志框架:JUL、JCL了赌、Jboss-logging诡宗、logback、log4j巴比、log4j2、slf4j...
- JCL(Jakarta Commons Logging) :spring 底層所使用的日志框架
- JUL(java.util.logging) :java提供的日志框架礁遵,是JDK在1.4版本中引入的Java原生日志框架
- Jboss-logging :就是jboss提供的日志框架(hibernate)
- log4j :Apache的一個開源項目轻绞,可以控制日志信息輸送的目的地是控制臺、文件佣耐、GUI組件等政勃,可以控制每一條日志的輸出格式,這些可以通過一個配置文件來靈活地進行配置兼砖,而不需要修改應(yīng)用的代碼奸远。雖然已經(jīng)停止維護了,但目前絕大部分企業(yè)都是用的log4j讽挟。
- logback :是由 Log4j 的作者設(shè)計完成的懒叛,擁有更好的特性,用來取代 Log4j 的一個日志框架耽梅,是 SLF4j 的原生實現(xiàn)
- log4j2:已經(jīng)不僅僅是 Log4j 的一個升級版本了薛窥,它從頭到尾都被重寫了。由于使用了 LMAX Disruptor 技術(shù)(無鎖異步)眼姐,使得日志的吞吐量诅迷、性能比 log4j 1.x 提高 10 倍,并解決了一些死鎖的 bug众旗,而且配置更加簡單靈活罢杉。
- slf4j(Simple Logging Facade for Java ):簡單的日志框架,也是logback 贡歧,log4j 的作者寫的屑那,主要是目前日志的抽象層
日志門面 (日志的抽象層) | 日志實現(xiàn) |
---|---|
JCL(Jakarta Commons Logging)、SLF4j(Simple Logging Facade for Java)艘款、jboss-logging | Log4j 持际、JUL(java.util.logging)、Log4j2 哗咆、Logback |
2.springboot日志框架選擇
SpringBoot 默認(rèn)選擇的是 SLF4J + Logback 的組合蜘欲,本篇文章講解的是默認(rèn)的日志
在實際項目中我們可以整合 Log4j2 來代替原來的 Logback(形成 SLF4J + Log4j2 組合)。采用 Log4j2 有如下幾個優(yōu)點:
- 相比與其他的日志系統(tǒng)晌柬,log4j2 丟數(shù)據(jù)的情況少姥份;
- 采用 disruptor 技術(shù)郭脂,在多線程環(huán)境下,性能高于 logback 等 10 倍以上(無論在同步日志模式還是異步日志模式下澈歉,在所有日志框架中 log4j2 性能都是最佳的)展鸡;
- 利用 jdk1.5 并發(fā)的特性,減少了死鎖的發(fā)生埃难;
3.日志級別
trace<debug<info<warn<error<fatal
??:Logback does not have a FATAL level. It is mapped to ERROR.(Logback沒有FATAL級別莹弊,映射到ERROR)
//記錄器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
//日志的級別;
//由低到高 trace<debug<info<warn<error
//可以調(diào)整輸出的日志級別涡尘;日志就只會在這個級別以以后的高級別生效
logger.trace("這是trace日志...");
logger.debug("這是debug日志...");
//SpringBoot默認(rèn)給我們使用的是info級別的忍弛,沒有指定級別的就用SpringBoot默認(rèn)規(guī)定的級別;root級別(默認(rèn)只有下面輸出信息)
logger.info("這是info日志...");
logger.warn("這是warn日志...");
logger.error("這是error日志...");
}
4.maven依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
5.控制臺輸出基本介紹
2019-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52
2019-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms
2019-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2019-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
輸出內(nèi)容:
? 時間日期:精確到毫秒考抄,易于排序
? 日志級別:ERROR, WARN, INFO, DEBUG ,TRACE
? 進程ID:圖中45469
? 分隔符:--- 分隔符用于區(qū)分實際日志消息的開始
? 線程名:方括號括起來(在控制臺輸出時可能被截斷细疚,也就是展示不全)
? Logger名:通常使用源代碼的類名(通常縮寫)
? ?日志消息
6.顏色配置
如果你的終端支持ANSI川梅,彩色輸出是用來幫助可讀性疯兼。你可以設(shè)置spring.output.ansi.enabled來改變默認(rèn)的自動檢測(detect):設(shè)置值
- ALWAYS
開啟彩色輸出 - DETECT
嘗試檢測ANSI 顏色是否支持 - NEVER
關(guān)閉彩色輸出
彩色編碼使用%clr轉(zhuǎn)換字配置,最簡單的情勢是根據(jù)日志級別進行色彩輸出贫途,例如:
%clr(%5p)
日志級別到顏色的映射:
Level | Color |
---|---|
FATAL | Red |
ERROR | Red |
WARN | Yellow |
INFO | Green |
DEBUG | Green |
TRACE | Green |
你可以通過在轉(zhuǎn)換器中提供選項來指定應(yīng)當(dāng)試用的色彩或風(fēng)格吧彪。例如,為了使文本顯示黃色:
%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}
支持的顏色:
? blue
? cyan
? faint
? green
? magenta
? red
? yellow
7.SpringBoot修改日志的默認(rèn)配置
① 設(shè)置日志級別
logging.level設(shè)置日志級別潮饱,后面跟生效的區(qū)域,比如root表示整個項目诫给,也可以設(shè)置為某個包下香拉,也可以具體到某個類名(日志級別的值不區(qū)分大小寫)
#日志的最低輸出級別調(diào)整,設(shè)置在com.xx包下
logging.level.com.xx=trace
#root日志以WARN級別輸出(讓日志只輸出warn及以上級別的信息)
logging.level.root=warn
#springframework.web日志以DEBUG級別輸出
logging.level.org.springframework.web=DEBUG
#hibernate日志以ERROR級別輸出
logging.level.org.hibernate=ERROR
② 日志路徑
# logging.path=
# 不指定路徑在當(dāng)前項目下生成springboot.log日志
# 可以指定完整的路徑;
# logging.file=/usr/xx/springboot.log
# 主要用這種形式
# 在當(dāng)前磁盤的根路徑下創(chuàng)建spring文件夾和里面的log文件夾中狂;使用 spring.log 作為默認(rèn)文件
logging.path=/spring/log
# 在控制臺輸出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志輸出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
logging.file | logging.path | Example | Description |
---|---|---|---|
(none) | (none) | 只在控制臺輸出 | |
指定文件名 | (none) | my.log | 輸出日志到my.log文件(可以是絕對路徑凫碌,也可以是相對路徑) |
(none) | 指定目錄 | /var/log | 輸出到指定目錄的 spring.log 文件中 |
指定文件名 | 指定目錄 | 輸出到文件名,前一個配置生效 |
當(dāng)日志文件到達(dá)10Mb時會循環(huán)保存胃榕。文件的大小限制可通過logging.file.max-size屬性設(shè)置盛险。之前保存的日志文件會無限期存檔,除非配置logging.file.max-history屬性
③ 日志輸出格式
%d:表示日期時間勋又,
%thread:表示線程名苦掘,
%-5level:級別從左顯示5個字符寬度,
%logger{50}:表示logger名字最長50個字符,否則按照句點分割楔壤。
%msg:日志消息鹤啡,
%n:換行符
實例:%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
8.自定義日志配置
① 配置文件名稱
在xml文件中,指定日志文件
Logging System | Customization |
---|---|
Logback | logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
建議將-spring變體用于日志記錄配置(例如蹲嚣,logback-spring.xml而不是logback.xml)递瑰。如果使用標(biāo)準(zhǔn)配置位置祟牲,Spring將無法完全控制日志初始化
如果你既想完全掌控日志配置,但又不想用logback.xml作為Logback配置的名字抖部,可以通過logging.config屬性指定自定義的名字:
logging.config=classpath:logback-config.xml
- Spring Boot包含了許多可以幫助進行高級配置的Logback擴展,您可以在logback-spring.xml配置文件中使用這些擴展名
- 由于標(biāo)準(zhǔn)的logback.xml配置文件加載的太早说贝,所以你不能在里面使用擴展部分,您需要使用logback-spring.xml或定義一個logging.config屬性
② springProfile標(biāo)簽針對不同開發(fā)環(huán)境
使用<springProfile>標(biāo)簽,您可以根據(jù)活動的Spring配置文件選擇包括或排除配置部分
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>
<springProfile name="dev | staging">
<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>
<springProfile name="!production">
<!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>
③ Environment Properties
該<springProperty>標(biāo)簽允許您公開來自Spring環(huán)境的屬性慎颗,以便在Logback中使用乡恕。如果要從application.properties中訪問文件中的值,這樣做很有用哗总。該標(biāo)簽的工作方式與Logback的<property>標(biāo)簽類似几颜。但是,不是指定直接的值value讯屈,而是指定屬性的源source(來自Environment)蛋哭。如果需要將該屬性存儲在局部作用域之外的其他地方,則可以使用scope屬性涮母。如果需要回退值(在Environment中沒有設(shè)置該屬性的情況下)谆趾,可以使用defaultValue屬性。以下示例顯示如何公開用于Logback的屬性
<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"
defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
<remoteHost>${fluentHost}</remoteHost>
...
</appender>
④ 配置詳解
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:當(dāng)此屬性設(shè)置為true時叛本,配置文件如果發(fā)生改變沪蓬,將會被重新加載,默認(rèn)值為true来候。
scanPeriod:設(shè)置監(jiān)測配置文件是否有修改的時間間隔跷叉,如果沒有給出時間單位,默認(rèn)單位是毫秒营搅。當(dāng)scan為true時云挟,此屬性生效。默認(rèn)的時間間隔為1分鐘转质。
debug:當(dāng)此屬性設(shè)置為true時园欣,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)休蟹。默認(rèn)值為false沸枯。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--每個logger都關(guān)聯(lián)到logger上下文,默認(rèn)上下文名稱為“default”赂弓。但可以使用設(shè)置成其他名字绑榴,用于區(qū)分不同應(yīng)用程序的記錄。一旦設(shè)置盈魁,不能修改,可以通過%contextName來打印日志上下文名稱 -->
<contextName>logback</contextName>
<!--property:用來定義變量值的標(biāo)簽彭沼, 有兩個屬性,name和value备埃;其中name的值是變量的名稱姓惑,value的值時變量定義的值褐奴。通過定義的值會被插入到logger上下文中。定義變量后于毙,可以使“${}”來使用變量-->
<property name="LOG_PATH" value="/usr/xx/log.log" />
<!--從配置文件中讀取logging.path屬性值-->
<springProperty name="LOG_HOME" source="logging.path"/>
<!--在pattern中直接用${pattern_format}調(diào)用公共部分-->
<property name="pattern_format" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n" />
<!-- <appender>:用來格式化日志輸出節(jié)點敦冬,有兩個屬性name和class,class用來指定哪種輸出策略唯沮,常用就是控制臺輸出策略和文件輸出策略脖旱。-->
<!--輸出到控制臺 ConsoleAppender -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--ThresholdFilter為系統(tǒng)定義的攔截器,此日志appender是為開發(fā)使用,只配置最低級別介蛉,此配置表示控制臺輸出的日志級別是大于或等于此級別的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<!--設(shè)置輸出格式 class可省略-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期萌庆,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息币旧,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
<!--配置顏色践险,可使用下面-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %blue(%logger{50}) - %highlight(%msg) %n</pattern>
<!--設(shè)置編碼,可省略-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--輸出到文件,時間窗口滾動-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名,指定最新的文件名吹菱,其他文件名使用FileNamePattern -->
<File>${LOG_PATH}/info.log</File>
<!--文件滾動模式-->
<!--第一種-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件輸出的文件名,可設(shè)置文件類型為gz,開啟文件壓縮,初始i為0-->
<FileNamePattern>${LOG_PATH}/info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天數(shù),也就是過期時間-->
<MaxHistory>15</MaxHistory>
<!--單個日志文件最大值巍虫,達(dá)到之后就進行切割-->
<maxFileSize>10MB</maxFileSize>
<!--日志文件總體的最大值,達(dá)到之后鳍刷,就會刪除舊的日志-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<!--關(guān)系:SizeAndTimeBasedRollingPolicy extends TimeBasedRollingPolicy-->
<!--第二種占遥,因TimeBasedRollingPolicy下沒有maxFileSize,像上面那樣配置后會報錯-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_PATH}/info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<MaxHistory>15</MaxHistory>
<totalSizeCap>1GB</totalSizeCap>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!--
上面配置意思:每天產(chǎn)生一個日志文件输瓜,如果超出了10M瓦胎,日志就進行切割,并且在日志文件名稱上加一,新的日志存入新的i++文件中尤揣;
日志文件最多保持15天搔啊,日志文件總共最大為1G;
當(dāng)超過1G時候芹缔,刪除舊的日志文件坯癣,在我測試時候發(fā)現(xiàn)瓶盛,如果某天的日志文件分割了最欠,會先刪除i=1的,再刪除i=0惩猫,接著i=2,3....
-->
<!--輸出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<!--設(shè)置編碼,可省略-->
<charset>UTF-8</charset>
</encoder>
<!-- 過濾器芝硬,過濾掉不是指定日志水平的日志,精確定位 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 設(shè)置日志級別 -->
<level>INFO</level>
<!-- 如果跟該日志水平相匹配轧房,則接受 -->
<onMatch>ACCEPT</onMatch>
<!-- 如果跟該日志水平不匹配拌阴,則過濾掉 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 指定主日志輸出級別,只有一個level屬性-->
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<!--<loger>指定自定義日志的級別奶镶,有name,level,addtivity屬性-->
<!-- logback為java中的包 -->
<logger name="com.xx.controller"/>
<!--
name:用來指定受此loger約束的某一個包或者具體的某一個類迟赃。
level:用來設(shè)置打印級別陪拘,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還 有一個特俗值INHERITED或者同義詞NULL纤壁,代表強制執(zhí)行上級的級別左刽。如果未設(shè)置此屬性,那么當(dāng)前l(fā)oger將會繼承上級的級別酌媒。
addtivity:是否向上級loger傳遞打印信息欠痴。默認(rèn)是true。
-->
<logger name="com.xx.controller.SpringController" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
</configuration>
root 指定的日志級別就是用類進行輸出的日志,例如:
private static Logger log = LoggerFactory.getLogger(logbackTest.class);
⑤ loger的使用:
public class TestController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@GetMapping("/show")
public void show() {
logger.trace("這是trace日志...");
logger.debug("這是debug日志...");
logger.info("這是info日志...");
logger.warn("這是warn日志...");
logger.error("這是error日志...");
}
}
<root level="info">
<appender-ref ref="console" />
</root>
- 第一種:帶有l(wèi)oger的配置秒咨,不指定級別喇辽,不指定appender
<logger name="com.mine.demo"/>
將控制demo包下的所有類的日志的打印,但是并沒用設(shè)置打印級別雨席,所以繼承他的上級的日志級別,即root的級別“info”菩咨;
沒有設(shè)置addtivity,默認(rèn)為true舅世,將此loger的打印信息向上級傳遞旦委,設(shè)置為false時候,執(zhí)行/show雏亚,show()方法執(zhí)行缨硝,但是不打印日志信息;
沒有設(shè)置appender罢低,此loger本身不打印任何信息查辩。
當(dāng)執(zhí)行該包下的某個類中的功能時,將方法內(nèi)所有日志信息傳遞給root网持,本身并不打右说骸;
root接到下級傳遞的信息功舀,交給已經(jīng)配置好的名為“console”的appender處理萍倡,“console”appender將信息打印到控制臺。
此配置類似:<logger name="com.mine.demo.TestDemoController" level="info" additivity="true">
結(jié)果:
2020-10-09 15:03:57.680 logback [http-nio-8080-exec-1] INFO com.mine.demo.TestDemoController - 這是info日志...
2020-10-09 15:03:57.680 logback [http-nio-8080-exec-1] WARN com.mine.demo.TestDemoController - 這是warn日志...
2020-10-09 15:03:57.681 logback [http-nio-8080-exec-1] ERROR com.mine.demo.TestDemoController - 這是error日志...
當(dāng)additivity=false時候辟汰,本身打印列敲,但是沒有設(shè)置appender,此loger本身不打印任何信息帖汞。
- 第二種:帶有多個loger的配置戴而,指定級別,指定appender
<logger name="com.mine.demo.TestDemoController" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
控制com.mine.demo.TestDemoController類的日志打印翩蘸,打印級別為“WARN”;
additivity屬性為false所意,表示此loger的打印信息不再向上級傳遞;
指定了名字為“console”的appender;
當(dāng)執(zhí)行TestDemoController中的方法時將級別為“WARN”及大于“WARN”的日志信息交給此loger指定的名為“console”的appender處理,在控制臺中打出日志,不再向上級root傳遞打印信息扶踊。
結(jié)果:
2020-10-09 14:42:19.792 logback [http-nio-8080-exec-1] WARN com.mine.demo.TestDemoController - 這是warn日志...
2020-10-09 14:42:19.792 logback [http-nio-8080-exec-1] ERROR com.mine.demo.TestDemoController - 這是error日志...
<logger name="com.mine.demo.TestDemoController" level="warn" additivity="true">
<appender-ref ref="console"/>
</logger>
<logger name="com.mine.demo.TestDemoController" level="info" additivity="false"/>
多個個同時存在時候泄鹏,后一個覆蓋前一個,level,additivity,appender后一個有則覆蓋秧耗,沒有則使用前一個配置命满,所以上面的level="debug", additivity="false", <appender-ref ref="console"/>
結(jié)果:
2020-10-09 15:03:57.680 logback [http-nio-8080-exec-1] INFO com.mine.demo.TestDemoController - 這是info日志...
2020-10-09 15:03:57.680 logback [http-nio-8080-exec-1] WARN com.mine.demo.TestDemoController - 這是warn日志...
2020-10-09 15:03:57.681 logback [http-nio-8080-exec-1] ERROR com.mine.demo.TestDemoController - 這是error日志...
<root level="warn">
<appender-ref ref="console" />
</root>
<logger name="com.mine.demo.TestDemoController" level="info" additivity="false">
<appender-ref ref="console"/>
</logger>
結(jié)果:
2020-10-09 15:30:12.696 logback [http-nio-8080-exec-1] INFO com.mine.demo.TestDemoController - 這是info日志...
2020-10-09 15:30:12.696 logback [http-nio-8080-exec-1] INFO com.mine.demo.TestDemoController - 這是info日志...
2020-10-09 15:30:12.698 logback [http-nio-8080-exec-1] WARN com.mine.demo.TestDemoController - 這是warn日志...
2020-10-09 15:30:12.698 logback [http-nio-8080-exec-1] WARN com.mine.demo.TestDemoController - 這是warn日志...
2020-10-09 15:30:12.698 logback [http-nio-8080-exec-1] ERROR com.mine.demo.TestDemoController - 這是error日志...
2020-10-09 15:30:12.698 logback [http-nio-8080-exec-1] ERROR com.mine.demo.TestDemoController - 這是error日志...
開始理解的時候是本身打印info級別,向上級root傳遞的時候绣版,上級是warn級別的胶台,所以打印是本身打印info級別以上的,上級只打印篩選的warn級別以上的杂抽。結(jié)果多次測試發(fā)現(xiàn)不是這樣诈唬。
后來理解:當(dāng)本身的打印日志信息傳遞給上級,上級只負(fù)責(zé)輸出缩麸。所以當(dāng)本身打印info日志铸磅,向上級root傳遞info信息,上級繼續(xù)打印info日志杭朱;打印warn日志......依次類推
9.最終配置logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 存放日志文件的路徑的根目錄 -->
<springProperty name="log_path" source="custom.logging.path"/>
<!--輸出到控制臺 ConsoleAppender -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<!--設(shè)置輸出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--文件輸出,時間窗口滾動-->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log_path}/info.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<MaxHistory>15</MaxHistory>
<maxFileSize>10MB</maxFileSize>
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_path}/error.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_path}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>15</maxHistory>
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
<!-- 此日志文檔只記錄ERROR級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<springProfile name="dev">
<root level="info">
<appender-ref ref="console"/>
</root>
<logger name="com.xx.dao" level="debug" />
</springProfile>
<springProfile name="test,prod">
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="info"/>
<appender-ref ref="error"/>
</root>
</springProfile>
</configuration>