今天又學(xué)了 Spring Boot logging,你學(xué)會了嗎?
大家好,我是指北君。
今天指北君將要帶實習(xí)生來了解下 Spring Boot 中日志框架的使用。
實習(xí)生:大佬好,今天你要講什么呀?
指北君:今天跟你講講 Spring Boot 日志是怎么回事的,先看下我整理的思維導(dǎo)圖吧。
今天就從這幾個角度來講。
實習(xí)生:好的,那我們先來看看概述吧。
指北君:spring boot 內(nèi)部使用的是 apache 開源的 commons logging 來記錄日志的。但是呢,它又提供了基礎(chǔ)的日志實現(xiàn)接口,方便向 java util logging、 log4j、logback之類的接入。spring boot 現(xiàn)在已經(jīng)為 Java util logging 、log4j2、logback 提供了默認(rèn)的實現(xiàn)。我們?nèi)绻枰褂玫脑挘灰唵闻渲镁涂梢粤恕?/p>
實習(xí)生:要這么說的話,spring boot 可真nb啊,輕輕松松就搞定了。你剛剛說了 spring boot 已經(jīng)內(nèi)置實現(xiàn)了 logback 這些, 那我看你圖里還有starter的描述啊,默認(rèn)所有的都夾在進(jìn)來了嗎?
指北君:小伙子可以啊,spring boot 當(dāng)然沒有把所有的都加載進(jìn)來,條件自動化配置你忘記了嗎?如果我們項目只依賴了一個 spring-boot-starter 的話,你看我這個項目的依賴圖,自由這么幾個,如果你想依賴 log4j2 的話,你要添加 spring-boot-starter-log4j2 才行。
實習(xí)生:soga, 我懂了。
指北君:我們來看看日志的輸出格式是怎么樣的。我們平時啟動項目的時候,在控制臺上看到的這些內(nèi)容,是有固定的格式的。
一開始是日期和時間,然后是日志的等級、線程ID、分割線、線程名稱、logger name 、日志消息。我在思維導(dǎo)圖里做了歸納, 日志等級這里我使用的是logback的等級制度,部分其他的會是以FATAL 代替 ERROR 的。
實習(xí)生:這個挺簡單的呀。你這么一畫,我感覺很清晰啊。你看這個終端輸出那里有不同的顏色,這個是怎么配置的呢?
指北君:不要著急啊, 你看我的思維導(dǎo)圖,下一個環(huán)節(jié)不就是要講了嗎?
默認(rèn)情況下,spring boot 項目的日志輸出方式是控制臺輸出??刂婆_輸出一般情況下只有3中輸出方式,就是上面寫的 ERROR、WARN、INFO。因為打開debug的話,所有其他的日志都會打出來,對我們開發(fā)來說不太方便。
實習(xí)生:那這個還是可以打開的吧,或者我想調(diào)試spring boot 的啟動過程之類的,我就想把它打開,這樣我對啟動過程可以看的更加清楚一些。
指北君:是的,你可以打開,而且也挺方便的。有兩種方式,第一種方式就是通過命令行設(shè)置
java -jar myapp.jar --debug
第二種:在配置文件里直接配置就行
application.properties 配置 debug=true
至于,剛才你說到的顏色問題,其實也蠻簡單的,如果你的控制臺支持 ASNI 的話,就配置一下就可以了,主要是配置%clr 這個輕輕松松搞定了。直接看思維導(dǎo)圖就行了。
實習(xí)生:你說的沒錯,但是我還有一個疑問,ASNI是什么?
指北君:這玩意就是一種編碼方式,一句兩句也講不清楚,我給你搜索一下吧。
ANSI是一種字符代碼,為使計算機(jī)支持更多語言,通常使用 0x00~0x7f 范圍的1 個字節(jié)來表示 1 個英文字符。超出此范圍的使用0x80~0xFFFF來編碼,即擴(kuò)展的ASCII編碼。
指北君:接下來我們看看文件輸出日志的配置,默認(rèn)情況下我們只要在applicaiton.properties文件直接配置就行了。
logging.file.name=app.log
logging.file.path=/xxx
實習(xí)生:這個我知道,但是你導(dǎo)圖上寫的文件分割,又是怎么回事呢?
指北君:這個你都沒懂嗎?我們?nèi)罩緦懭氲轿募镏螅绻覀儾惶幚淼脑?,文件可以把你電腦寫爆了。另一方面,方便我們處理日志文件啊。
實習(xí)生:好的,大佬我錯了。我怎么沒想到呢。
指北君:別扯這些,我們繼續(xù)來看。
實習(xí)生:你這個寫的啥意思???沒懂,上面不是講過了,再講一遍?
指北君:上面只是提了下等級,并沒有提怎么設(shè)置,你看仔細(xì)了,我們可以針對某個package來設(shè)置日志輸出的等級。
實習(xí)生:唉,這個我怎么沒想到呢,可以單獨設(shè)置。我之前看項目我都沒注意到這個問題。
指北君:沒關(guān)系,現(xiàn)在不是已經(jīng)知道了嗎?我們繼續(xù)吧。
實習(xí)生:好的,大佬,你這里寫的日志關(guān)閉hook是干啥的?
指北君:其實這個就像我們spring boot 怎么做到優(yōu)雅停機(jī)一樣。我們要做到先把日志打印入口先關(guān)閉了,然后把打印的日志打印完,我再結(jié)束我這個日志打印的線程。
實習(xí)生:你這么說我就明白了。
指北君:上面講述的都是通過配置spring boot 默認(rèn)實現(xiàn)的方式來配置日志,我們還可以自己個性化配置日志輸出的情況。在這我們以前spring 項目的時候,是很常見的。我們現(xiàn)在也一直在延續(xù)使用這種方式。
實習(xí)生:那你這個最后那個環(huán)節(jié) 也是和這個自定義配置有關(guān)了吧
指北君:你小子眼睛還挺尖的啊,我這里主要是說明兩個東西,一個是 spring boot profiles在日志文件中的應(yīng)用。
<springProfile name="dev | staging">
...
</springProfile>
另外一個是怎么引入 sping的環(huán)境變量。
<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>
實習(xí)生:hoho,可以啊,這操作不錯。
總結(jié)
指北君今天就是帶大家過一遍 spring boot logging 是什么一回事,怎么配置使用的。
本文的所有示例源代碼和完整的思維導(dǎo)圖都已上傳到了 Github:
https://github.com/javatechnorth/java-north-sample






