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