---
URL: "/zh-CN/blog/2026-03/spring-boot-logs.html"
LLMS_URL: "/zh-CN/blog/2026-03/spring-boot-logs.md"
lastUpdated: true
commentabled: true
recommended: true
title: "基于 Spring Boot 的全方位日志指南"
description: "你真的会打印日志吗？"
date:

pageClass: "blog-page-class"
cover: "/covers/springboot.svg"
---

---
lastUpdated: true
commentabled: true
recommended: true
title: 基于 Spring Boot 的全方位日志指南
description: 你真的会打印日志吗？
date: 2026-03-09 10:05:00 
pageClass: blog-page-class
cover: /covers/springboot.svg
---

## 一、日志概述：为什么它比 System.out.println 更重要？ ##

在 [Java 开发]早期，我们习惯使用 `System.out.println()` 来调试代码 。但随着项目复杂度提升，简单的打印语句已无法满足生产环境的需求 。

### 日志的核心用途 ###

- 系统监控：记录系统运行状态、方法响应时间及状态，设置阈值报警 。
- 数据采集：统计 PV/UV、用户留存，为推荐算法提供原始数据 。
- 日志审计：记录用户操作记录，追踪非法攻击或信息泄露（如谁删除了关键数据） 。

### 为什么弃用标准输出？ ###

通过 `System.out.print` 打印的日志相比 Spring Boot 默认日志缺少了时间戳、日志级别、进程 ID、线程名等关键排查信息。

## 二、日志框架体系：门面模式的深度解析 ##

Spring Boot 默认集成了 SLF4J 作为日志门面，并使用 Logback 作为具体实现。

### 门面模式 (Facade Pattern) ###

SLF4J 是门面模式的典型应用 。它为子系统（如 Log4j、JUL、Logback）提供统一接口，使得客户端无需关心底层实现。

- 优点：减少系统依赖，提高灵活性，简化客户端使用难度。

### 常见框架对比 ###

| **角色**        |      **框架名称**      |    **说明**      |
| :------------- | :-----------: | :-----------: |
|   日志门面   |  SLF4J, commons-logging  |  统一 API 接口，不含逻辑实现  |
|   日志实现   |  Logback, Log4j 1/2, JUL  |  负责具体的日志记录逻辑  |

## 三、实战：Spring Boot 日志的基本使用 ##

### 传统方式获取日志对象 ###

需要使用 `LoggerFactory` 获取，并指定当前类的 Class 对象 。

```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LoggerController {
    // 注意：Logger 对象必须属于 org.slf4j 包 
    private static final Logger logger = LoggerFactory.getLogger(LoggerController.class);

    public String logTest() {
        logger.info("这是一条 INFO 级别的日志");
        return "Log Success";
    }
}
```

### 进阶方式：使用 Lombok (@Slf4j) ###

引入 Lombok 依赖后，只需一个注解即可自动生成 `log` 对象。

```java
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;

@Slf4j // 自动提供 log 对象
@RestController
public class LogController {
    public void log() {
        log.info("使用 Lombok 快速打印日志");
    }
}
```

## 四、深入理解日志级别 ##

日志级别按严重程度从高到低排列为：`FATAL > ERROR > WARN > INFO > DEBUG > TRACE`。

- ERROR：记录较高等级的错误，但不影响系统运行 。
- WARN：警告信息，需引起注意 。
- INFO：默认级别，记录系统运行的关键节点。
- DEBUG：调试阶段的关键信息 。

> 注意：Spring Boot 默认级别为 INFO，因此默认情况下不会打印 DEBUG 和 TRACE 级别的日志 。

## 五、日志的高级配置 (application.yml) ##

### 修改日志级别 ###

```yaml
logging:
  level:
    root: debug # 将全局日志级别设为 debug [cite: 39]
```

### 日志持久化 ###

在线上环境中，必须将日志保存到文件。

```yaml
logging:
  file:
    name: logger/springboot.log # 指定文件名（推荐使用） 
    path: D:/temp           # 仅指定目录，文件名为默认的 spring.log 
```

### 日志文件分割 ###

为防止单个日志文件过大（默认超过 10MB 分割），可进行如下配置：

```yaml
logging:
  logback:
    rollingpolicy:
      max-file-size: 1KB # 达到 1KB 自动分割（实际生产常用 200MB）
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i # 分割后的命名格式
```

## 六、自定义日志格式说明 ##

通过 `logging.pattern.console` 或 `logging.pattern.file` 可以自定义输出格式。

| **占位符**        |      **说明**      |
| :------------- | :-----------: |
|   `%d`   | 日期和时间（精确到毫秒）  |
|   `%5p`   | 日志级别  |
|   `%c`   | 类的全限定名  |
|   `%m`   | 日志消息内容  |

## 七、总结 ##

- 日志的重要性：它是程序运行的“黑匣子”，是定位问题、审计安全、分析数据的核心依据 。
- 最佳实践：推荐使用 Lombok 的 `@Slf4j` 注解，并通过 YAML 配置文件实现日志的级别控制、持久化及滚动拆分。
