如何為?Spring?Boot?項(xiàng)目配置?Logback?日志
關(guān)于 Logback
日志系統(tǒng)是一個(gè)線上項(xiàng)目必備的素質(zhì)之一,代表性的日志框架 Log4j、SLF4J、Logback 這哥仨竟然是親兄弟,他們有一個(gè)親爹,那就是巨佬 Ceki Gulcu。
由于 Spring Boot 的默認(rèn)日志框架選用的 Logback,再加上 Log4j2 之前爆過(guò)嚴(yán)重的漏洞,所以我們這次就只關(guān)注 Logback。
1)Logback 非常自然地實(shí)現(xiàn)了 SLF4J,不需要像 Log4j 和 JUL 那樣加一個(gè)適配層。

2)Spring Boot 的默認(rèn)日志框架使用的是 Logback,啟動(dòng)編程喵項(xiàng)目的時(shí)候就可以看到 Logback 記錄的日志了

怎么看出來(lái)是 logback 呢?
說(shuō)實(shí)話,看不出來(lái),哈哈哈,不過(guò)可以從 Spring Boot 官網(wǎng)找到證據(jù)。

源碼中也偶有

3)logback 分為三個(gè)模塊:
- logback-core,核心模塊,提供了關(guān)鍵的通用機(jī)制;
- logback-classic,可以看作是 log4j 的改進(jìn)版,實(shí)現(xiàn)了簡(jiǎn)單的日志門(mén)面 SLF4J;
- logback-access,主要用來(lái)和 Servlet 容器交互,比如說(shuō) Tomcat,提供了一些 HTTP 訪問(wèn)的功能。
如果想研究 logback 源碼的話,可以按照這三個(gè)模塊去研究
直接上手
不廢話,直接新建一個(gè)空的 Spring Boot 項(xiàng)目,在測(cè)試類(lèi)中加上兩行代碼。
@SpringBootTest
class CodingmoreLogbackApplicationTests {
static Logger logger = LoggerFactory.getLogger(CodingmoreLogbackApplicationTests.class);
@Test
void contextLoads() {
logger.info("logback testing");
}
}Logger 和 LoggerFactory 都來(lái)自 SLF4J,所以如果項(xiàng)目是從 Log4j + SLF4J 切換到 Logback 的話,此時(shí)的代碼是零改動(dòng)的。
其他什么也不用做,運(yùn)行后就可以看到 logback 已經(jīng)正常工作了。

在沒(méi)有配置文件的情況下,一切都是默認(rèn)的,Logback 的日志信息會(huì)輸出到控制臺(tái)。可以通過(guò) StatusPrinter 來(lái)打印 Logback 的內(nèi)部信息:
LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory(); StatusPrinter.print(lc);
再次運(yùn)行測(cè)試類(lèi),可以在控制臺(tái)看到以下信息:

也就是說(shuō),Logback 會(huì)在 classpath 路徑下先尋找 logback-test.xml 文件,沒(méi)有找到的話,尋找 logback.xml 文件,都找不到的話,就輸出到控制臺(tái)。
并且,Logger 的默認(rèn)日志級(jí)別是 INFO 級(jí)別的,這就意味著如果嘗試下面的代碼:
logger.debug("哈哈哈哈");控制臺(tái)是看不到這行日志輸出的。Logback 的日志級(jí)別是這樣的:
TRACE < DEBUG < INFO < WARN < ERROR
也就是說(shuō)小于 INFO 級(jí)別的日志都不會(huì)記錄,只有大于等于 INFO 級(jí)別的日志才會(huì)被記錄
編程喵實(shí)戰(zhàn)項(xiàng)目的日志案例分析
盡管默認(rèn)配置很有用,但它很可能不能滿足我們的實(shí)際開(kāi)發(fā)需求,于是我們需要找到一種更優(yōu)雅的解決方案。
當(dāng) src/main/resources 目錄下有以下名稱之一的配置文件時(shí),Spring Boot 將自動(dòng)加載它來(lái)作為 Logback 的配置項(xiàng):
- logback-spring.xml
- logback.xml
- logback-spring.groovy
- logback.groovy
Spring Boot 建議我們使用 -spring 結(jié)尾的配置文件,這樣可以使用 Spring Boot 的 Pro?le 功能(針對(duì)不同的環(huán)境(開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、正式環(huán)境)提供不同的配置項(xiàng))。
編程喵用的是 logback-spring.xml(在 codingmore-admin 項(xiàng)目下可以找得到):
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true。
scanPeriod:設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔,如果沒(méi)有給出時(shí)間單位,默認(rèn)單位是毫秒當(dāng)scan為true時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。
debug:當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。
-->
<configuration>
<!-- https://github.com/spring-projects/spring-boot/blob/v1.4.2.RELEASE/spring-boot/src/main/resources/org/springframework/boot/logging/logback/defaults.xml -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!-- 定義日志文件名稱 -->
<property name="APP_NAME" value="codingmore-admin" />
<!-- 定義日志文件的路徑 -->
<property name="LOG_PATH" value="${user.home}/${APP_NAME}/logs" />
<!-- 定義日志的文件名 -->
<property name="LOG_FILE" value="${LOG_PATH}/${APP_NAME}.log" />
<!-- 滾動(dòng)記錄日志,先將日志記錄到指定文件,當(dāng)符合某個(gè)條件時(shí),將日志記錄到其他文件 -->
<appender name="APPLICATION"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 指定日志文件的名稱 -->
<file>${LOG_FILE}</file>
<!--
當(dāng)發(fā)生滾動(dòng)時(shí),決定 RollingFileAppender 的行為,涉及文件移動(dòng)和重命名
TimeBasedRollingPolicy: 最常用的滾動(dòng)策略,它根據(jù)時(shí)間來(lái)制定滾動(dòng)策略,既負(fù)責(zé)滾動(dòng)也負(fù)責(zé)觸發(fā)滾動(dòng)。
-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--
滾動(dòng)時(shí)產(chǎn)生的文件的存放位置及文件名稱
%d{yyyy-MM-dd}:按天進(jìn)行日志滾動(dòng)
%i:當(dāng)文件大小超過(guò)maxFileSize時(shí),按照i進(jìn)行文件滾動(dòng)
-->
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--
可選節(jié)點(diǎn),控制保留的歸檔文件的最大數(shù)量,超出數(shù)量就刪除舊文件。假設(shè)設(shè)置每天滾動(dòng),
且maxHistory是7,則只保存最近7天的文件,刪除之前的舊文件。
注意,刪除舊文件時(shí),那些為了歸檔而創(chuàng)建的目錄也會(huì)被刪除。
-->
<maxHistory>7</maxHistory>
<!--
當(dāng)日志文件超過(guò)maxFileSize指定的大小時(shí),根據(jù)上面提到的%i進(jìn)行日志文件滾動(dòng)
注意此處配置SizeBasedTriggeringPolicy是無(wú)法實(shí)現(xiàn)按文件大小進(jìn)行滾動(dòng)的,
必須配置timeBasedFileNamingAndTriggeringPolicy
-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 日志輸出格式: -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
</layout>
</appender>
<!-- ch.qos.logback.core.ConsoleAppender 表示控制臺(tái)輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--
日志輸出格式:
%d表示日期時(shí)間,%green 綠色
%thread表示線程名,%magenta 洋紅色
%-5level:級(jí)別從左顯示5個(gè)字符寬度 %highlight 高亮色
%logger{36} 表示logger名字最長(zhǎng)36個(gè)字符,否則按照句點(diǎn)分割 %yellow 黃色
%msg:日志消息
%n是換行符
-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%green(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%magenta(%thread)] %highlight(%-5level) %yellow(%logger{36}): %msg%n</pattern>
</layout>
</appender>
<!--
root與logger是父子關(guān)系,沒(méi)有特別定義則默認(rèn)為root,任何一個(gè)類(lèi)只會(huì)和一個(gè)logger對(duì)應(yīng),
要么是定義的logger,要么是root,判斷的關(guān)鍵在于找到這個(gè)logger,然后判斷這個(gè)logger的appender和level。
-->
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="APPLICATION" />
</root>
</configuration>具體含義都寫(xiě)在了注釋里,大家可以細(xì)致看一下,了解即可?;旧仙a(chǎn)環(huán)境下的 Logback 配置就是這樣的,可微調(diào)。
也可以使用下面這份 logback-spring.xml。
<?xml version="1.0" encoding="UTF-8"?>
<configuration >
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="APP_NAME" value="codingmore-admin" />
<property name="LOG_PATH" value="${user.home}/${APP_NAME}/logs" />
<property name="LOG_FILE" value="${LOG_PATH}/codingmore-admin.log" />
<appender name="APPLICATION"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>7</maxHistory>
<maxFileSize>50MB</maxFileSize>
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
</appender>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="APPLICATION" />
</root>
</configuration>只說(shuō)幾個(gè)不同的點(diǎn)。
FILE_LOG_PATTERN 和 CONSOLE_LOG_PATTERN 是在 Spring Boot 中默認(rèn)定義的。

使用 lombok 進(jìn)行日志記錄
在上面的例子中,我們必須在類(lèi)中聲明一個(gè)靜態(tài)的 Logger 對(duì)象才能在需要記錄日志的地方使用它。
static Logger logger = LoggerFactory.getLogger(CodingmoreLogbackApplicationTests.class);
這樣的樣板代碼令人生厭!
我們可以通過(guò) lombok 的方式來(lái)解決這個(gè)問(wèn)題,在 pom.xml 文件中加入依賴。
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
然后在類(lèi)上加上 @Slf4j 注解,之后就可以直接使用 log(添加@Slf4j 注解后會(huì)自動(dòng)添加一個(gè) log 字段)來(lái)記錄日志了。
@SpringBootTest
@Slf4j
class CodingmoreLogbackApplicationTests {
@Test
void testSlf4j() {
log.info("哈哈啊哈哈");
}
}運(yùn)行該測(cè)試方法,可以在控制臺(tái)看到日志
日志文件也有
查看字節(jié)碼反編譯后的文件就明白了。lombok 在編譯的時(shí)候會(huì)自動(dòng)添加一行代碼:
private static final Logger log = LoggerFactory.getLogger(CodingmoreLogbackApplicationTests.class);

logback 中文手冊(cè)
GitHub 上有一份 Logback 的中文手冊(cè),總共有 150 多頁(yè),主要包含以下基本的和高級(jí)的特性:
- logback 的整體架構(gòu)
- 討論 logback 最好的實(shí)踐以及反模式
- logback 的 xml 配置方式
- appender
- encoder
- layout
- filter
- 上下文診斷
- Joran - logback 的配置系統(tǒng)
GitHub - YLongo/logback-chinese-manual: logback 中文手冊(cè)/文檔。

到此這篇關(guān)于如何為 Spring Boot 項(xiàng)目配置 Logback 日志的文章就介紹到這了,更多相關(guān)Spring Boot 配置 Logback 日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring Boot 日志級(jí)別及配置詳解
- springboot中l(wèi)ogback日志配置的詳細(xì)說(shuō)明
- 一文帶你搞定SpringBoot Log4j2日志配置文件
- SpringBoot日志配置SLF4J和Logback的方法實(shí)現(xiàn)
- Spring?Boot整合log4j2日志配置的詳細(xì)教程
- SpringBoot日志配置全過(guò)程
- Spring?Boot日志打印配置詳細(xì)介紹
- Springboot日志配置的實(shí)現(xiàn)示例
- SpringBoot3配置Logback日志滾動(dòng)文件的方法
- Spring Boot配置日志的實(shí)現(xiàn)步驟
相關(guān)文章
深入解析Java設(shè)計(jì)模式編程中觀察者模式的運(yùn)用
這篇文章主要介紹了Java設(shè)計(jì)模式編程中觀察者模式的運(yùn)用,觀察者模式主要是為了將對(duì)象進(jìn)行與被觀察者一樣的實(shí)現(xiàn),需要的朋友可以參考下2016-02-02
java使用zookeeper實(shí)現(xiàn)的分布式鎖示例
這篇文章主要介紹了java使用zookeeper實(shí)現(xiàn)的分布式鎖示例,需要的朋友可以參考下2014-05-05
java實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)單鏈表示例(java單鏈表)
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)單鏈表示例,需要的朋友可以參考下2014-03-03
Java中的Opencv簡(jiǎn)介與開(kāi)發(fā)環(huán)境部署方法
OpenCV是一個(gè)開(kāi)源的計(jì)算機(jī)視覺(jué)和圖像處理庫(kù),提供了豐富的圖像處理算法和工具,它支持多種圖像處理和計(jì)算機(jī)視覺(jué)算法,可以用于物體識(shí)別與跟蹤、圖像分割與邊緣檢測(cè)、圖像特征提取與描述等應(yīng)用,本文介紹Java中的Opencv簡(jiǎn)介與開(kāi)發(fā)環(huán)境部署方法,感興趣的朋友一起看看吧2025-01-01
SpringBoot整合mybatis常見(jiàn)問(wèn)題(小結(jié))
這篇文章主要介紹了SpringBoot整合mybatis常見(jiàn)問(wèn)題(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
基于javamelody監(jiān)控springboot項(xiàng)目過(guò)程詳解
這篇文章主要介紹了基于javamelody監(jiān)控springboot項(xiàng)目過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11

