Spring Boot異步輸出Logback日志方法詳解
一、介紹
1.1 Logback
Logback是由log4j創(chuàng)始人設(shè)計的另一個開源日志組件,它分為下面下個模塊:
- logback-core:其它兩個模塊的基礎(chǔ)模塊
- logback-classic:它是log4j的一個改良版本,同時它完整實現(xiàn)了slf4j API使你可以很方便地更換成其它日志系統(tǒng)如log4j或JDK14 Logging
- logback-access:訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能
1.2 日志級別
包括:TRACE、DEBUG、INFO、WARN 和 ERROR。
1.2.1 TRACE
特別詳細的系統(tǒng)運行完成信息,業(yè)務(wù)代碼中,不要使用。(除非有特殊用意,否則請使用DEBUG級別替代)
1.2.2 DEBUG
- 可以填寫所有的想知道的相關(guān)信息(但不代表可以隨便寫,debug信息要有意義,最好有相關(guān)參數(shù));
- 生產(chǎn)環(huán)境需要關(guān)閉DEBUG信息
- 如果在生產(chǎn)情況下需要開啟DEBUG,需要使用開關(guān)進行管理,不能一直開啟。
1.2.3 INFO
系統(tǒng)運行信息
- Service方法中對于系統(tǒng)/業(yè)務(wù)狀態(tài)的變更;
- 主要邏輯中的分步驟。
外部接口部分
- 客戶端請求參數(shù)(REST/WS);
- 調(diào)用第三方時的調(diào)用參數(shù)和調(diào)用結(jié)果。
說明
- 并不是所有的service都進行出入口打點記錄,單一、簡單service是沒有意義的;
- 對于復(fù)雜的業(yè)務(wù)邏輯,需要進行日志打點,以及埋點記錄,比如電商系統(tǒng)中的下訂單邏輯,以及OrderAction操作(業(yè)務(wù)狀態(tài)變更);
- 對于整個系統(tǒng)的提供出的接口(REST/WS),使用INFO記錄入?yún)ⅲ?/li>
- 如果所有的service為SOA架構(gòu),那么可以看成是一個外部接口提供方,那么必須記錄入?yún)ⅲ?/li>
- 調(diào)用其他第三方服務(wù)時,所有的出參和入?yún)⑹潜仨氁涗浀?因為你很難追溯第三方模塊發(fā)生的問題)。
1.2.4 WARN
- 不應(yīng)該出現(xiàn)但是不影響程序、當前請求正常運行的異常情況:
- 有容錯機制的時候出現(xiàn)的錯誤情況;
- 找不到配置文件,但是系統(tǒng)能自動創(chuàng)建配置文件;
- 即將接近臨界值的時候,例如:緩存池占用達到警告線;
- 業(yè)務(wù)異常的記錄,比如:當接口拋出業(yè)務(wù)異常時,應(yīng)該記錄此異常。
1.2.5 ERROR
影響到程序正常運行、當前請求正常運行的異常情況:
- 打開配置文件失??;
- 所有第三方對接的異常(包括第三方返回錯誤碼);
- 所有影響功能使用的異常,包括:SQLException和除了業(yè)務(wù)異常之外的所有異常(RuntimeException和Exception)。
不應(yīng)該出現(xiàn)的情況:
如果進行了拋出異常操作,請不要記錄ERROR日志,由最終處理方進行處理:
反例(不要這么做):
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的依賴,所以重點放在編寫配置文件上,需要引入什么依賴,日志依賴沖突統(tǒng)統(tǒng)都不需要我們管了;
- logback框架會默認加載classpath下命名為logback-spring或logback的配置文件。
- 將所有日志都存儲在一個文件中文件大小也隨著應(yīng)用的運行越來越大并且不好排查問題,正確的做法應(yīng)該是將ERROR日志和其他日志分開,并且不同級別的日志根據(jù)時間段進行記錄存儲。
二、logback 配置
2.1 配置文件logback-spring.xml示例
<?xml version="1.0" encoding="utf-8"?> <configuration> <!-- 屬性文件:在配置文件中找到對應(yīng)的配置項 --> <springProperty scope="context" name="logPath" source="logging.path"/> <!-- 輸出到控制臺 --> <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級別高(包括info級別)但除error級別的日志 --> <appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 指定過濾策略 --> <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> <!-- 指定收集策略:滾動策略--> <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"> <!-- 指定過濾策略 --> <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> <!-- 指定收集策略:滾動策略--> <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"> <!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 --> <queueSize>256</queueSize> <!-- 添加附加的appender,最多只能添加一個 --> <appender-ref ref="INFO-LOG"/> </appender> <appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 --> <queueSize>256</queueSize> <!-- 添加附加的appender,最多只能添加一個 --> <appender-ref ref="ERROR-LOG"/> </appender> <!-- 指定最基礎(chǔ)的日志輸出級別 --> <root level="info"> <appender-ref ref="CONSOLE-LOG" /> <appender-ref ref="INFO-LOG" /> <appender-ref ref="ERROR-LOG" /> </root> </configuration>
項目配置文件中配置日志輸出地址
logging: path: ./logs
2.2 標簽說明
- <root>標簽:指定最基礎(chǔ)的日志輸出級別;
- <appender-ref>標簽,添加append
- <appender>標簽:指定日志的收集策略
- name屬性指定appender命名
- class屬性指定輸出策略,通常有兩種,控制臺輸出和文件輸出,文件輸出就是將日志進行一個持久化。ConsoleAppender將日志輸出到控制臺。
- <filter>標簽:指定過濾策略
- <level>:指定過濾的類型。
- <encoder>標簽:使用該標簽下的<pattern>標簽指定日志輸出格式。
- <rollingPolicy>標簽:指定收集策略,比如基于時間進行收集
- 標簽指定生成日志保存地址,實現(xiàn)了按天分類以及日志的目標了。
三、 源碼
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關(guān)文章
SpringBoot中的ApplicationListener事件監(jiān)聽器使用詳解
這篇文章主要介紹了SpringBoot中的ApplicationListener事件監(jiān)聽器使用詳解,ApplicationListener是應(yīng)用程序的事件監(jiān)聽器,繼承自java.util.EventListener標準接口,采用觀察者設(shè)計模式,需要的朋友可以參考下2023-11-11Java并發(fā)編程之柵欄(CyclicBarrier)實例介紹
這篇文章主要介紹了Java并發(fā)編程之柵欄(CyclicBarrier)實例介紹,柵欄類似閉鎖,但是它們是有區(qū)別的,需要的朋友可以參考下2015-04-04SpringBoot項目使用slf4j的MDC日志打點功能(最新推薦)
這篇文章主要介紹了SpringBoot項目使用slf4j的MDC日志打點功能,本文通過示例代碼給大家介紹非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06使用BeanFactory實現(xiàn)創(chuàng)建對象
這篇文章主要為大家詳細介紹了使用BeanFactory實現(xiàn)創(chuàng)建對象,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08java多態(tài)實現(xiàn)電子寵物系統(tǒng)
這篇文章主要為大家詳細介紹了java多態(tài)實現(xiàn)電子寵物系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02