Spring Boot 内置日志框架 Logback - 以及 lombok 介绍
SpringBoot支持多种日志框架,包括 Logback、Log4j2 和 Java Util Logging(JUL)。默认情况下,如果你使用SpringBoot 的 starters 启动器,它将使用 Logback 作为日志框架。
本文重点介绍 spring boot 默认的日志框架 Logback 、SLF4J 依赖、Lombok 依赖
日志的核心自然是日志框架。
日志框架对比:
特性 / 框架 | Logback | Log4j2 | JUL (java.util.logging) |
---|---|---|---|
官方支持 | 官方推荐 | Apache 官方 | Java 内置 |
性能 | 高 | 高,异步性能更好 | 中等 |
配置方式 | XML / Groovy | XML / JSON / YAML | properties / API |
Spring Boot 默认 | ✅ 内置 | ❌ 需要排除默认依赖再添加 | ❌ 可以替换,但不方便 |
特性 | 滚动策略丰富、异步支持、Spring Boot 支持日志级别动态调整 | 更强大、异步性能好、多线程优化 | 简单、易用但功能有限 |
学习成本 | 低-中 | 中 | 低 |
Spring Boot 的内置日志实现是由 SLF4J + Logback 框架实现, Lombok 仅仅是一个辅助。
先学习 SLF4J
SLF4J 介绍
SLF4J 是一个 日志门面(Facade), 它提供 统一的日志 API,解耦日志框架实现 , 你用 SLF4J 写日志时,不用关心底层具体用的是 Logback、Log4j2、JUL(Java Util Logging)还是其他实现,统一使用门面类:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;private static final Logger log = LoggerFactory.getLogger(MyApp.class);
这也是 Spring boot 的starter 默认集成的依赖,如图,我们就不用手动集成这个依赖了。
SLF4J 仅仅是一个门面类,没有具体实现,统一了API的调用。
日志的具体能力由 Logback 框架提供,接下来学习。
Logback 日志框架介绍
Logback 是一个 Java 日志框架,由 Log4j 的作者 Ceki Gülcü 开发,是 Log4j 的“继任者”, 在 Spring Boot 里,Logback 是 默认日志实现,通过 spring-boot-starter-logging
自动引入。
一般来说,无论是 Logback , Log4j2 还是其他框架,主要都提供三个重要的功能,记录日志,日志级别,日志输出。
1、日志记录
- 提供一套统一的 API 来打印日志(trace/debug/info/warn/error)。
2、日志级别控制
- 根据配置决定哪些日志需要打印、哪些忽略。
- 典型例子:生产环境只打印
WARN
及以上,开发环境允许DEBUG
。
3、日志路由与输出
- 日志输出到哪里:控制台、文件、数据库、网络、异步队列……
- 日志格式如何定义:时间戳、线程名、日志级别、MDC 上下文。
- 这部分就是“日志落地”的关键。
我们来看看 Logback 框架的三大核心模块:
- logback-core:基础模块(其他两个的依赖)
- logback-classic:完整实现 SLF4J 的日志框架(Spring Boot 默认使用它)
- logback-access:与 Servlet 容器集成,记录 HTTP 访问日志
上面所说的日志三个基本功能:记录日志,日志级别,日志输出,这三个功能仅需一个 logback-classic 模块和logback.xml
配置就能实现,不过它 依赖 logback-core 来完成底层实现(Appender、Layout、Filter 这些东西在 core 里) ,logback-access 只是加一个“web access log”的功能,不是大多数项目必须的。
作为使用者,我们要知道 SLF4J 门面类的API, 即可使用日志功能,知道了底层是 logback 依赖库,便可以更换别的依赖库,体验其他库的功能。
日志级别
级别从高到低, 生产环境通常只打印 WARN 及以上
ERROR > WARN > INFO > DEBUG > TRACE
TRACE(ALL):最详细的日志,用来跟踪程序的每一步执行,基本只在本地排查 bug 用。
DEBUG:用于调试信息,通常用于开发和调试阶段。
INFO:提供程序运行时的重要信息,用于指示应用程序正常运行。
WARN:表示潜在的问题,不会导致应用程序失败,但可能需要关注。
ERROR:表示错误事件,可能导致应用程序出现问题。
OFF:关闭日志。
实践 logback 框架
创建一个springboot项目,什么依赖都不用引入,如图,默认有 logback 依赖
创建一个包 controller,包下创建 UserController 类,实现 CommandLineRunner,作用模拟调用 getUser() 接口, 会在 Spring 容器启动完成之后,马上执行CommandLineRunner.run() 方法。
package com.codebear.springboothelloword.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class UserController implements CommandLineRunner {private static final Logger log = LoggerFactory.getLogger(UserController.class);@Overridepublic void run(String... args) throws Exception {getUser();log.error("一条 error 日志");log.warn("一条 warn 日志");log.info("一条 info 日志");log.debug("一条 debug 日志");log.trace("一条 trace 日志");}public static String getUser() {log.info("getUser方法执行");return "hello world";}
}
启动就能看到日志输出在控制台
如果想要修改日志级别,使用 Spring boot 配置文件修改
logging:level:root: WARN # 全局日志级别,默认是 INFOcom.codebear.springboothelloword.controller: WARN # 指定包的日志级别
测试输出仅有两条日志:
实践发现,默认的日志框架需要创建一个 Logger 对象,有点麻烦,开发中经常引用一个 lombok 依赖,配合 @Slf4j
注解更方便使用日志功能。
介绍 Lombok
Lombok 是一个 编译时代码生成工具,它本身不实现日志功能,不依赖 Logback。作用是提供注解 @Slf4j
、@Log4j2
,注解帮你自动生成日志对象(Logger 变量),避免手动创建 Logger 对象。
另外
这是一个编译时代码生成工具,意思是在编译期会生成代码到 .class 文件中, 生成后的字节码和手写代码效果完全一致 , 所以最终.class 文件包含了 Logger 对象的代码,@Data 等注解也是生成代码,所以在打 jar 包时,可以不需要把 lombok 打入jar 包。
lombok 提供的注解有:
注解 | 功能 | 举例 |
---|---|---|
@Getter / @Setter | 自动生成 getter/setter 方法 | @Getter @Setter private String name; |
@ToString | 自动生成 toString() 方法 | @ToString |
@EqualsAndHashCode | 自动生成 equals() 和 hashCode() | @EqualsAndHashCode |
@NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor | 自动生成构造器 | @AllArgsConstructor |
@Data | 综合注解,生成 getter/setter、toString、equals/hashCode、RequiredArgsConstructor | @Data class User { private String name; } |
@Slf4j / @Log4j2 / @Log | 自动生成日志对象 private static final Logger log | @Slf4j → log.info("hello") |
其他还有 @Builder
、@SneakyThrows
、@Cleanup
等,用于简化构建对象、异常处理、资源关闭等。
所以lombok依赖仅仅是帮我们简化了代码的编写,本质上日志能力是由 logback 框架提供,并非 lombok 提供。
日志输出目标
日志默认输出在控制台,如同上例。
我们可以设置日志输出到文件、消息队列等地方,。
输出到文件:
logging:file:name: logs/app.log # 指定日志文件(自动创建目录和文件)
测试效果
输出到消息队列比较复杂,spring 配置文件默认仅支持控制台 + 文件输出 。 如果你要用输出到消息队列 , 就需要用 Logback 原生配置,也就是 logback-spring.xml
或 logback.xml
。
新建配置文件 logback-spring.xml
,路径如下:
Spring Boot 启动时,会自动去 classpath 根目录(也就是 resources/
)下找这个文件。
有此需求再看官方文档或 AI 编写配置吧~