使用Logback在SpringBoot項目中實現(xiàn)日志記錄功能
一、為什么選擇 Logback?
Logback 是 SLF4J 的實現(xiàn),提供了以下優(yōu)勢:
- 高性能:Logback 的性能優(yōu)于 Log4j,并且在處理日志時效率很高。
- 日志輸出靈活:支持多種輸出方式,包括控制臺、文件、數(shù)據(jù)庫等。
- 日志滾動機制:支持基于時間、大小的日志文件滾動,避免單個日志文件過大。
- 動態(tài)配置:可以在不重啟應(yīng)用的情況下修改日志配置。
- 與 Spring Boot 集成:Spring Boot 默認使用 Logback,且易于集成。
二、環(huán)境準備
假設(shè)我們正在開發(fā)一個電商應(yīng)用程序。我們需要為項目中的各個模塊(如購物車模塊、訂單模塊等)記錄日志。下面是我們需要用到的技術(shù)棧:
- Spring Boot 3.x
- Logback(已與 Spring Boot 默認集成)
- SLF4J(作為日志接口)
三、配置 Logback
1、配置文件 logback.xml
在 Spring Boot 項目的 resources 目錄下,我們通常會添加一個名為 logback.xml 的文件,用于配置日志的輸出格式、級別、文件位置等。
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路徑 -->
<property name="log.path" value="logs/donglin-cart" />
<!-- 日志輸出格式 -->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<!-- 控制臺輸出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系統(tǒng)操作日志輸出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 日志文件滾動策略:基于時間滾動 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 保留最多30天的日志 -->
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 錯誤日志輸出 -->
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 設(shè)置日志級別 com.donglin.ai這個目錄下的都會被記錄-->
<logger name="com.donglin.ai" level="info" />
<logger name="org.springframework" level="warn" />
<!-- 根日志配置 -->
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
</configuration>
配置解析:
- log.path:定義了日志文件的存放路徑。在本例中,日志文件將保存在
logs/donglin-cart目錄下。 - log.pattern:定義了日志輸出的格式,包含了時間戳、線程名、日志級別、日志消息等。
- console appender:配置了控制臺輸出,將日志輸出到開發(fā)者的控制臺。
- RollingFileAppender:配置了日志文件輸出,并且使用時間滾動策略。每天一個新文件,并且最多保留 30 天的日志。
- LevelFilter:用于過濾日志級別。
file_info只輸出INFO及以上的日志,file_error只輸出ERROR級別的日志。 - logger:為特定的包設(shè)置了日志級別。在本例中,
com.donglin.ai包的日志級別為INFO,org.springframework包的日志級別為WARN。
四、實戰(zhàn)案例:購物車模塊日志記錄
在電商項目中,我們要在購物車模塊中記錄操作日志。比如,當(dāng)用戶將商品添加到購物車時,我們希望記錄下商品信息、數(shù)量以及操作時間等。
1、CartServiceImpl.java
package com.donglin.java.ai.langchain4j.service.impl;
import com.donglin.java.ai.langchain4j.service.CartService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class CartServiceImpl implements CartService {
private static final Logger logger = LoggerFactory.getLogger(CartServiceImpl.class);
public void addToCart(Long userId, Long productId, Integer quantity) {
// 記錄普通信息日志
logger.info("用戶 {} 添加商品 {} 到購物車,數(shù)量: {}", userId, productId, quantity);
// 模擬業(yè)務(wù)邏輯
if (quantity <= 0) {
// 記錄錯誤日志
logger.error("添加商品失敗,商品數(shù)量無效: {}", quantity);
throw new IllegalArgumentException("商品數(shù)量無效");
}
// 記錄調(diào)試日志
logger.debug("正在將商品 {} 添加到用戶 {} 的購物車中...", productId, userId);
// 成功后記錄信息日志
logger.info("商品 {} 成功添加到用戶 {} 的購物車中", productId, userId);
}
}
2、CartController.java
package com.donglin.java.ai.langchain4j.controller;
import com.donglin.java.ai.langchain4j.service.CartService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/cart")
public class CartController {
@Autowired
private CartService cartService;
@Operation(summary = "將商品添加到購物車", description = "根據(jù)用戶ID、商品ID和數(shù)量將商品添加到購物車")
@PostMapping("/add")
public String addToCart(
@Parameter(name = "userId", description = "用戶ID", required = true) @RequestParam Long userId,
@Parameter(name = "productId", description = "商品ID", required = true) @RequestParam Long productId,
@Parameter(name = "quantity", description = "商品數(shù)量", required = true) @RequestParam Integer quantity) {
try {
cartService.addToCart(userId, productId, quantity);
return "商品已成功添加到購物車";
} catch (Exception e) {
// 錯誤日志
return "添加商品到購物車失敗";
}
}
}
3、日志輸出
在控制臺和日志文件中,你將看到如下日志輸出:
控制臺日志:
2025-10-11 14:23:44.526 [http-nio-8081-exec-3] INFO c.d.j.a.l.s.impl.CartServiceImpl - 用戶 1 添加商品 2 到購物車,數(shù)量: 6 2025-10-11 14:23:44.527 [http-nio-8081-exec-3] INFO c.d.j.a.l.s.impl.CartServiceImpl - 商品 2 成功添加到用戶 1 的購物車中 2025-10-11 14:23:45.089 [http-nio-8081-exec-4] INFO c.d.j.a.l.s.impl.CartServiceImpl - 用戶 1 添加商品 2 到購物車,數(shù)量: 6 2025-10-11 14:23:45.089 [http-nio-8081-exec-4] INFO c.d.j.a.l.s.impl.CartServiceImpl - 商品 2 成功添加到用戶 1 的購物車中 2025-10-11 14:23:45.521 [http-nio-8081-exec-5] INFO c.d.j.a.l.s.impl.CartServiceImpl - 用戶 1 添加商品 2 到購物車,數(shù)量: 6 2025-10-11 14:23:45.521 [http-nio-8081-exec-5] INFO c.d.j.a.l.s.impl.CartServiceImpl - 商品 2 成功添加到用戶 1 的購物車中 2025-10-11 14:23:48.322 [http-nio-8081-exec-6] INFO c.d.j.a.l.s.impl.CartServiceImpl - 用戶 1 添加商品 2 到購物車,數(shù)量: 0
錯誤日志文件(error.log):
2025-10-11 14:23:49.304 [http-nio-8081-exec-7] ERROR c.d.j.a.l.s.impl.CartServiceImpl - 添加商品失敗,商品數(shù)量無效: 0

五、文件生成的時間點
在使用 TimeBasedRollingPolicy 配置時,日志文件的切割是基于時間的,通常是按照每天的零點來生成新的日志文件。所以,當(dāng)你設(shè)置了:
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
這意味著 日志文件每天都會滾動并生成一個新文件,但是:
- 當(dāng)天的日志文件會一直記錄到第二天的零點才會被切割為新的文件。
- 第二天零點時,現(xiàn)有的
info.log文件會被重命名為info.yyyy-MM-dd.log(按日期命名),并創(chuàng)建一個新的info.log用于繼續(xù)記錄新的日志。
因此,今天生成的日志文件不會立即滾動到第二天的新文件,需要等到第二天零點才會生成新的日志文件。
1、驗證
修改系統(tǒng)時間

成功生成

六、總結(jié)
- 配置了日志的輸出路徑、格式和滾動策略。
- 結(jié)合實際業(yè)務(wù)場景,在
CartService中記錄了普通操作日志、調(diào)試日志和錯誤日志。 - 通過 Logback 配置文件控制日志的輸出位置(控制臺和文件)以及不同級別的日志過濾。
以上就是使用Logback在SpringBoot項目中實現(xiàn)日志記錄功能的詳細內(nèi)容,更多關(guān)于SpringBoot Logback日志記錄的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(概要分析)
這篇文章主要為大家詳細介紹了Java并發(fā)系列之AbstractQueuedSynchronizer源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02
如何利用Retrofit+RxJava實現(xiàn)網(wǎng)絡(luò)請求的異常處理
這篇文章主要介紹了如何利用Retrofit+RxJava實現(xiàn)網(wǎng)絡(luò)請求的異常處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04
Java?-jar參數(shù)詳解之掌握Java可執(zhí)行JAR文件的運行技巧
做項目的時候我們肯定接觸過很多jar包,下面這篇文章主要給大家介紹了關(guān)于Java?-jar參數(shù)詳解之掌握Java可執(zhí)行JAR文件的運行技巧,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11
SpringBoot整合MinIO實現(xiàn)文件上傳的方法詳解
一般涉及到文件上傳,基本上都是保存在項目本地,這種方式比較省事,但是安全性不高。所以今天給大伙詳細介紹一些如何利用MinIO實現(xiàn)文件上傳,感興趣的可以了解一下2022-05-05
mybatis實現(xiàn)批量插入并返回主鍵(xml和注解兩種方法)
這篇文章主要介紹了mybatis實現(xiàn)批量插入并返回主鍵(xml和注解兩種方法),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12

