Spring Boot異步輸出Logback日志方法詳解
一、介紹
1.1 Logback
Logback是由log4j創(chuàng)始人設(shè)計(jì)的另一個(gè)開(kāi)源日志組件,它分為下面下個(gè)模塊:
- logback-core:其它兩個(gè)模塊的基礎(chǔ)模塊
- logback-classic:它是log4j的一個(gè)改良版本,同時(shí)它完整實(shí)現(xiàn)了slf4j API使你可以很方便地更換成其它日志系統(tǒng)如log4j或JDK14 Logging
- logback-access:訪問(wèn)模塊與Servlet容器集成提供通過(guò)Http來(lái)訪問(wèn)日志的功能
1.2 日志級(jí)別
包括:TRACE、DEBUG、INFO、WARN 和 ERROR。
1.2.1 TRACE
特別詳細(xì)的系統(tǒng)運(yùn)行完成信息,業(yè)務(wù)代碼中,不要使用。(除非有特殊用意,否則請(qǐng)使用DEBUG級(jí)別替代)
1.2.2 DEBUG
- 可以填寫(xiě)所有的想知道的相關(guān)信息(但不代表可以隨便寫(xiě),debug信息要有意義,最好有相關(guān)參數(shù));
- 生產(chǎn)環(huán)境需要關(guān)閉DEBUG信息
- 如果在生產(chǎn)情況下需要開(kāi)啟DEBUG,需要使用開(kāi)關(guān)進(jìn)行管理,不能一直開(kāi)啟。
1.2.3 INFO
系統(tǒng)運(yùn)行信息
- Service方法中對(duì)于系統(tǒng)/業(yè)務(wù)狀態(tài)的變更;
- 主要邏輯中的分步驟。
外部接口部分
- 客戶(hù)端請(qǐng)求參數(shù)(REST/WS);
- 調(diào)用第三方時(shí)的調(diào)用參數(shù)和調(diào)用結(jié)果。
說(shuō)明
- 并不是所有的service都進(jìn)行出入口打點(diǎn)記錄,單一、簡(jiǎn)單service是沒(méi)有意義的;
- 對(duì)于復(fù)雜的業(yè)務(wù)邏輯,需要進(jìn)行日志打點(diǎn),以及埋點(diǎn)記錄,比如電商系統(tǒng)中的下訂單邏輯,以及OrderAction操作(業(yè)務(wù)狀態(tài)變更);
- 對(duì)于整個(gè)系統(tǒng)的提供出的接口(REST/WS),使用INFO記錄入?yún)ⅲ?/li>
- 如果所有的service為SOA架構(gòu),那么可以看成是一個(gè)外部接口提供方,那么必須記錄入?yún)ⅲ?/li>
- 調(diào)用其他第三方服務(wù)時(shí),所有的出參和入?yún)⑹潜仨氁涗浀?因?yàn)槟愫茈y追溯第三方模塊發(fā)生的問(wèn)題)。
1.2.4 WARN
- 不應(yīng)該出現(xiàn)但是不影響程序、當(dāng)前請(qǐng)求正常運(yùn)行的異常情況:
- 有容錯(cuò)機(jī)制的時(shí)候出現(xiàn)的錯(cuò)誤情況;
- 找不到配置文件,但是系統(tǒng)能自動(dòng)創(chuàng)建配置文件;
- 即將接近臨界值的時(shí)候,例如:緩存池占用達(dá)到警告線;
- 業(yè)務(wù)異常的記錄,比如:當(dāng)接口拋出業(yè)務(wù)異常時(shí),應(yīng)該記錄此異常。
1.2.5 ERROR
影響到程序正常運(yùn)行、當(dāng)前請(qǐng)求正常運(yùn)行的異常情況:
- 打開(kāi)配置文件失敗;
- 所有第三方對(duì)接的異常(包括第三方返回錯(cuò)誤碼);
- 所有影響功能使用的異常,包括:SQLException和除了業(yè)務(wù)異常之外的所有異常(RuntimeException和Exception)。
不應(yīng)該出現(xiàn)的情況:
如果進(jìn)行了拋出異常操作,請(qǐng)不要記錄ERROR日志,由最終處理方進(jìn)行處理:
反例(不要這么做):
try{
....
}catch(Exception ex){
String errorMessage=String.format("Error while reading information of user [%s]",userName);
logger.error(errorMessage,ex);
throw new UserServiceException(errorMessage,ex);
}
1.3 SpringBoot 中 logback
- SpringBoot工程自帶logback和slf4j的依賴(lài),所以重點(diǎn)放在編寫(xiě)配置文件上,需要引入什么依賴(lài),日志依賴(lài)沖突統(tǒng)統(tǒng)都不需要我們管了;
- logback框架會(huì)默認(rèn)加載classpath下命名為logback-spring或logback的配置文件。
- 將所有日志都存儲(chǔ)在一個(gè)文件中文件大小也隨著應(yīng)用的運(yùn)行越來(lái)越大并且不好排查問(wèn)題,正確的做法應(yīng)該是將ERROR日志和其他日志分開(kāi),并且不同級(jí)別的日志根據(jù)時(shí)間段進(jìn)行記錄存儲(chǔ)。
二、logback 配置
2.1 配置文件logback-spring.xml示例
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- 屬性文件:在配置文件中找到對(duì)應(yīng)的配置項(xiàng) -->
<springProperty scope="context" name="logPath" source="logging.path"/>
<!-- 輸出到控制臺(tái) -->
<appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
</layout>
</appender>
<!-- 獲取比info級(jí)別高(包括info級(jí)別)但除error級(jí)別的日志 -->
<appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 指定過(guò)濾策略 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<!-- 指定日志輸出格式 -->
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
</encoder>
<!-- 指定收集策略:滾動(dòng)策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 指定生成日志保存地址 -->
<fileNamePattern>${logPath}/info.%d.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 指定過(guò)濾策略 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<!-- 指定日志輸出格式 -->
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
</encoder>
<!-- 指定收集策略:滾動(dòng)策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--指定生成日志保存地址 -->
<fileNamePattern>${logPath}/error.%d.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 異步輸出 -->
<appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丟失日志.默認(rèn)的,如果隊(duì)列的80%已滿(mǎn),則會(huì)丟棄TRACT、DEBUG、INFO級(jí)別的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默認(rèn)的隊(duì)列的深度,該值會(huì)影響性能.默認(rèn)值為256 -->
<queueSize>256</queueSize>
<!-- 添加附加的appender,最多只能添加一個(gè) -->
<appender-ref ref="INFO-LOG"/>
</appender>
<appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丟失日志.默認(rèn)的,如果隊(duì)列的80%已滿(mǎn),則會(huì)丟棄TRACT、DEBUG、INFO級(jí)別的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默認(rèn)的隊(duì)列的深度,該值會(huì)影響性能.默認(rèn)值為256 -->
<queueSize>256</queueSize>
<!-- 添加附加的appender,最多只能添加一個(gè) -->
<appender-ref ref="ERROR-LOG"/>
</appender>
<!-- 指定最基礎(chǔ)的日志輸出級(jí)別 -->
<root level="info">
<appender-ref ref="CONSOLE-LOG" />
<appender-ref ref="INFO-LOG" />
<appender-ref ref="ERROR-LOG" />
</root>
</configuration>
項(xiàng)目配置文件中配置日志輸出地址
logging: path: ./logs
2.2 標(biāo)簽說(shuō)明
- <root>標(biāo)簽:指定最基礎(chǔ)的日志輸出級(jí)別;
- <appender-ref>標(biāo)簽,添加append
- <appender>標(biāo)簽:指定日志的收集策略
- name屬性指定appender命名
- class屬性指定輸出策略,通常有兩種,控制臺(tái)輸出和文件輸出,文件輸出就是將日志進(jìn)行一個(gè)持久化。ConsoleAppender將日志輸出到控制臺(tái)。
- <filter>標(biāo)簽:指定過(guò)濾策略
- <level>:指定過(guò)濾的類(lèi)型。
- <encoder>標(biāo)簽:使用該標(biāo)簽下的<pattern>標(biāo)簽指定日志輸出格式。
- <rollingPolicy>標(biāo)簽:指定收集策略,比如基于時(shí)間進(jìn)行收集
- 標(biāo)簽指定生成日志保存地址,實(shí)現(xiàn)了按天分類(lèi)以及日志的目標(biāo)了。
三、 源碼
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- SpringBoot項(xiàng)目的logback日志配置(包括打印mybatis的sql語(yǔ)句)
- 基于logback 實(shí)現(xiàn)springboot超級(jí)詳細(xì)的日志配置
- springboot使用Logback把日志輸出到控制臺(tái)或輸出到文件
- SpringBoot Logback日志記錄到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法
- 在SpringBoot中使用Logback管理記錄日志
- 詳解Spring Boot配置使用Logback進(jìn)行日志記錄的實(shí)戰(zhàn)
- springboot配置logback日志管理過(guò)程詳解
- SpringBoot日志信息以及Lombok的常用注解詳析
相關(guān)文章
SpringBoot開(kāi)發(fā)案例 分布式集群共享Session詳解
這篇文章主要介紹了SpringBoot開(kāi)發(fā)案例 分布式集群共享Session詳解,在分布式系統(tǒng)中,為了提升系統(tǒng)性能,通常會(huì)對(duì)單體項(xiàng)目進(jìn)行拆分,分解成多個(gè)基于功能的微服務(wù),可能還會(huì)對(duì)單個(gè)微服務(wù)進(jìn)行水平擴(kuò)展,保證服務(wù)高可用,需要的朋友可以參考下2019-07-07
quartz實(shí)現(xiàn)定時(shí)功能實(shí)例詳解(servlet定時(shí)器配置方法)
Quartz是一個(gè)完全由java編寫(xiě)的開(kāi)源作業(yè)調(diào)度框架,下面提供一個(gè)小例子供大家參考,還有在servlet配置的方法2013-12-12
SpringBoot參數(shù)校驗(yàn):@Valid與@Validated使用詳解
這篇文章主要介紹了SpringBoot參數(shù)校驗(yàn):@Valid與@Validated使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
java poi判斷excel是xlsx還是xls類(lèi)型
這篇文章主要為大家詳細(xì)介紹了如何利用java poi來(lái)判斷excel是xlsx還是xls類(lèi)型,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2024-10-10
基于Eclipce配置Spring Boot過(guò)程圖解
這篇文章主要介紹了基于Eclipce配置Spring Boot過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Spring?IOC?xml方式進(jìn)行工廠Bean操作詳解
這篇文章主要介紹了Spring?IOC?xml方式進(jìn)行工廠Bean操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01
java 判斷一個(gè)數(shù)組中的數(shù)值是否連續(xù)相鄰的方法
下面小編就為大家分享一篇java 判斷一個(gè)數(shù)組中的數(shù)值是否連續(xù)相鄰的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
詳解MyBatisPlus如何實(shí)現(xiàn)分頁(yè)和查詢(xún)操作
這篇文章主要為大家詳細(xì)介紹了MyBatisPlus是如何實(shí)現(xiàn)分頁(yè)和查詢(xún)操作的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的幫助,需要的可以參考一下2022-05-05

