詳解Spring Boot實(shí)現(xiàn)日志記錄 SLF4J
在開(kāi)發(fā)中打印內(nèi)容,使用 System.out.println() 和 Log4j 應(yīng)當(dāng)是人人皆知的方法了。
其實(shí)在開(kāi)發(fā)中我們不建議使用 System.out 因?yàn)榇罅康氖褂?System.out 會(huì)增加資源的消耗。
而Log4j 更為靈活在性能上也相比 System.out 要高,我們可以配置輸出級(jí)別,可以指定多個(gè)日志文件分別記錄不同的日志。
使用 System.out 是在當(dāng)前線程執(zhí)行的,寫(xiě)入文件也是寫(xiě)入完畢后才繼續(xù)執(zhí)行下面的程序。而使用Log工具不但可以控制日志是否輸出,怎么輸出,它的處理機(jī)制也是通知寫(xiě)日志,繼續(xù)執(zhí)行后面的代碼不必等日志寫(xiě)完。
如非必要,建議大家不要使用控制臺(tái)輸出,因?yàn)榭刂婆_(tái)輸出沒(méi)有優(yōu)先級(jí)會(huì)顯得輸出太亂。
個(gè)人推薦使用 SLF4J(Simple Logging Facade For Java)的logback來(lái)輸出日志,其比log4j 要好,因?yàn)樗矢摺?/p>
spring Boot 提供了一套日志系統(tǒng),logback是最優(yōu)先的選擇。配置了logback.xml可以利用Spring Boot提供的默認(rèn)日志配置:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <logger name="org.springframework.web" level="DEBUG"/> </configuration>
這樣就定義了一個(gè) 捕獲 org.springframework.web 的日志,日志級(jí)別是 DEBUG,上面引用的base.xml 文件內(nèi)容為:
<?xml version="1.0" encoding="UTF-8"?> <!-- Base logback configuration provided for compatibility with Spring Boot 1.1 --> <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>
Spring Boot的日志系統(tǒng)預(yù)先定義了一些系統(tǒng)變量:
PID,當(dāng)前進(jìn)程ID{LOG_FILE},Spring Boot配置文件(application.properties|.yml)中l(wèi)ogging.file的值
${LOG_PATH}, Spring Boot配置文件中l(wèi)ogging.path的值
同時(shí)默認(rèn)情況下包含另個(gè)appender——一個(gè)是控制臺(tái),一個(gè)是文件,分別定義在console-appender.xml和file-appender.xml中。同時(shí)對(duì)于應(yīng)用的日志級(jí)別也可以通過(guò)application.properties進(jìn)行定義:
logging.level.org.springframework.web=DEBUG logging.level.org.springboot.sample=TRACE
這樣相當(dāng)于我們?cè)趌ogback.xml 中配置的對(duì)應(yīng)的日志級(jí)別。名稱(chēng)以logging.level開(kāi)頭,后面跟要輸入日志的包名。
如果在 logback.xml 和 application.properties 中定義了相同的配置(如都配置了 org.springframework.web)但是輸出級(jí)別不同,則實(shí)際上 application.properties 的優(yōu)先級(jí)高于 logback.xml *
我們既然使用了maven來(lái)管理項(xiàng)目,我們就可以根據(jù)不同環(huán)境來(lái)定義不同的日志輸出,在 logback-spring.xml 中使用 springProfile 節(jié)點(diǎn)來(lái)定義,方法如下:
注意文件名稱(chēng)不是logback.xml,想使用spring擴(kuò)展profile支持,要以logback-spring.xml命名
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml" /> <logger name="org.springframework.web" level="INFO"/> <logger name="org.springboot.sample" level="TRACE" /> <springProfile name="dev"> <logger name="org.springboot.sample" level="DEBUG" /> </springProfile> <springProfile name="staging"> <logger name="org.springboot.sample" level="INFO" /> </springProfile> </configuration>
如上我們默認(rèn)為 org.springboot.sample 定義了TRACE級(jí)別的輸出,下面又定義兩個(gè) springProfile ,分別是 dev 和 staging,輸出級(jí)別分別是 DEBUG 和 INFO
我們可以啟動(dòng)服務(wù)的時(shí)候指定 profile (如不指定使用默認(rèn)),如指定staging 的方式為:
java -jar myapp.jar --spring.profiles.active=staging
下面介紹兩種常用的Appender
ConsoleAppender
Logback使用appender來(lái)定義日志輸出,在開(kāi)發(fā)過(guò)程中最常用的是將日志輸出到控制臺(tái):
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <Pattern>.%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %n</Pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>TRACE</level> </filter> </appender>
表示對(duì)日志進(jìn)行編碼
- %d{HH:mm:ss.SSS}——日志輸出時(shí)間
- %thread——輸出日志的進(jìn)程名字,這在Web應(yīng)用以及異步任務(wù)處理中很有用
- %-5level——日志級(jí)別,并且使用5個(gè)字符靠左對(duì)齊
- %logger{36}——日志輸出者的名字
- %msg——日志消息
- %n——平臺(tái)的換行符
在這種格式下一條日志的輸出結(jié)果如下:
10:12:51.012 [threadName] DEBUG o.c.d.r.util.LoggingResponseFilter
RollingFileAppender
另一種常見(jiàn)的日志輸出到文件,隨著應(yīng)用的運(yùn)行時(shí)間越來(lái)越長(zhǎng),日志也會(huì)增長(zhǎng)的越來(lái)越多,將他們輸出到同一個(gè)文件并非一個(gè)好辦法。RollingFileAppender用于切分文件日志:
<appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>/data/log/app.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <FileNamePattern>rest-demo.%d{yyyy-MM-dd}.log</FileNamePattern> <!-- keep 30 days' worth of history --> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern> </encoder> </appender>
其中重要的是rollingPolicy的定義,上例中rest-demo.%d{yyyy-MM-dd}.log定義了日志的切分方式——把每一天的日志歸檔到一個(gè)文件中,30表示只保留最近30天的日志,以防止日志填滿整個(gè)磁盤(pán)空間。同理,可以使用%d{yyyy-MM-dd_HH-mm}來(lái)定義精確到分的日志切分方式。
Sentry
Sentry是一個(gè)統(tǒng)一的日志跟蹤平臺(tái),在傳統(tǒng)的日志管理中,都是在服務(wù)器上通過(guò)tail, vim等工具查看日志,并且不同的日志位置也個(gè)不相同,而Sentry則是將這些日志(主要是錯(cuò)誤日志)通過(guò)統(tǒng)一的接口收集起來(lái),并且提供跟蹤、管理的功能,使得應(yīng)用程序的錯(cuò)誤、Bug能夠即時(shí)被解決。
Sentry提供了Java庫(kù)——Raven Java,Java應(yīng)用程序能夠在捕獲異常后將其發(fā)送到Sentry服務(wù)器中,另一方面它包含了各類(lèi)日志框架的支持,以Logbakc為例:
<dependency> <groupId>net.kencochrane.raven</groupId> <artifactId>raven-logback</artifactId> <version>6.0.0</version> </dependency>
在logback.xml中定義appender:
<configuration> <appender name="Sentry" class="net.kencochrane.raven.logback.SentryAppender"> <dsn>https://publicKey:secretKey@host:port/1?options</dsn> <tags>tag1:value1,tag2:value2</tags> <!-- Optional, allows to select the ravenFactory --> <!--<ravenFactory>net.kencochrane.raven.DefaultRavenFactory</ravenFactory>--> </appender> <root level="warn"> <appender-ref ref="Sentry"/> </root> </configuration>
我們推薦在這個(gè)中加入用于過(guò)濾 ERROR 級(jí)別的日志。
總結(jié)
在Spring Boot 中記錄日志只需兩步:
1、在 src/main/resources 下面創(chuàng)建logback.xml 文件,并按上面講述的進(jìn)行配置。
或者使用最簡(jiǎn)單的方法在 application 配置文件中配置。
2、在Java代碼中創(chuàng)建實(shí)例,并在需要輸出日志的地方使用。
// 在Java類(lèi)中創(chuàng)建 logger 實(shí)例 private static final Logger logger = LoggerFactory.getLogger(SpringBootSampleApplication.class); // 在方法中使用日志輸出,如 public void logTest() { logger.debug("日志輸出測(cè)試 Debug"); logger.trace("日志輸出測(cè)試 Trace"); logger.info("日志輸出測(cè)試 Info"); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Springboot項(xiàng)目使用Slf4j將日志保存到本地目錄的實(shí)現(xiàn)代碼
- Spring Boot中slf4j日志依賴(lài)關(guān)系示例詳解
- SpringBoot集成slf4j+log4j2的示例代碼
- 詳解Spring Boot 使用slf4j+logback記錄日志配置
- Springboot使用@Valid 和AOP做參數(shù)校驗(yàn)及日志輸出問(wèn)題
- 詳解基于SpringBoot使用AOP技術(shù)實(shí)現(xiàn)操作日志管理
- Spring Boot配置AOP打印日志的全過(guò)程
- Springboot日志開(kāi)啟SLF4J過(guò)程解析
相關(guān)文章
Idea Jrebel 報(bào)錯(cuò):Cannot reactivate,offline 
本文主要介紹了Idea Jrebel 報(bào)錯(cuò):Cannot reactivate,offline seat in use,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06RSA加密的方式和解密方式實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)?lái)一篇RSA加密的方式和解密方式實(shí)現(xiàn)方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06Java實(shí)現(xiàn)多線程大批量同步數(shù)據(jù)(分頁(yè))
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多線程大批量同步數(shù)據(jù)(分頁(yè)),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Java語(yǔ)言中的自定義類(lèi)加載器實(shí)例解析
這篇文章主要介紹了Java語(yǔ)言中的自定義類(lèi)加載器實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02Java比較器實(shí)現(xiàn)方法項(xiàng)目案例
這篇文章主要介紹了Java比較器實(shí)現(xiàn)方法,結(jié)合具體項(xiàng)目案例形式分析了Java比較器相關(guān)排序操作技巧,需要的朋友可以參考下2019-03-03mybatis-plus配置日志兩種實(shí)現(xiàn)方式
這篇文章主要給大家介紹了關(guān)于mybatis-plus配置日志兩種實(shí)現(xiàn)方式的相關(guān)資料,Mybatis-plus集成了日志框架,可以將程序運(yùn)行時(shí)產(chǎn)生的日志進(jìn)行記錄,方便開(kāi)發(fā)人員進(jìn)行問(wèn)題排查,需要的朋友可以參考下2023-09-09Java底層基于鏈表實(shí)現(xiàn)集合和映射--集合Set操作詳解
這篇文章主要介紹了Java底層基于鏈表實(shí)現(xiàn)集合和映射集合Set操作,結(jié)合實(shí)例形式詳細(xì)分析了Java使用鏈表實(shí)現(xiàn)集合和映射相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-03-03