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)还是其他实现,统一使用门面类:

java 复制代码
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 框架的三大核心模块:

  1. logback-core:基础模块(其他两个的依赖)
  2. logback-classic:完整实现 SLF4J 的日志框架(Spring Boot 默认使用它)
  3. logback-access:与 Servlet 容器集成,记录 HTTP 访问日志

上面所说的日志三个基本功能:记录日志,日志级别,日志输出,这三个功能仅需一个 logback-classic 模块和logback.xml配置就能实现,不过它 依赖 logback-core 来完成底层实现(Appender、Layout、Filter 这些东西在 core 里) ,logback-access 只是加一个"web access log"的功能,不是大多数项目必须的。

作为使用者,我们要知道 SLF4J 门面类的API, 即可使用日志功能,知道了底层是 logback 依赖库,便可以更换别的依赖库,体验其他库的功能。

日志级别

级别从高到低, 生产环境通常只打印 WARN 及以上

java 复制代码
ERROR  >  WARN  >  INFO  >  DEBUG  >  TRACE

TRACE(ALL):最详细的日志,用来跟踪程序的每一步执行,基本只在本地排查 bug 用。

DEBUG:用于调试信息,通常用于开发和调试阶段。

INFO:提供程序运行时的重要信息,用于指示应用程序正常运行。

WARN:表示潜在的问题,不会导致应用程序失败,但可能需要关注。

ERROR:表示错误事件,可能导致应用程序出现问题。

OFF:关闭日志。

实践 logback 框架

创建一个springboot项目,什么依赖都不用引入,如图,默认有 logback 依赖

创建一个包 controller,包下创建 UserController 类,实现 CommandLineRunner,作用模拟调用 getUser() 接口, 会在 Spring 容器启动完成之后,马上执行CommandLineRunner.run() 方法。

java 复制代码
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);


    @Override
    public 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 配置文件修改

yaml 复制代码
logging:
  level:
    root: WARN              # 全局日志级别,默认是 INFO
    com.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 @Slf4jlog.info("hello")

其他还有 @Builder@SneakyThrows@Cleanup 等,用于简化构建对象、异常处理、资源关闭等。

所以lombok依赖仅仅是帮我们简化了代码的编写,本质上日志能力是由 logback 框架提供,并非 lombok 提供。

日志输出目标

日志默认输出在控制台,如同上例。

我们可以设置日志输出到文件、消息队列等地方,。

输出到文件:

yaml 复制代码
logging:
  file:
    name: logs/app.log     # 指定日志文件(自动创建目录和文件)

测试效果

输出到消息队列比较复杂,spring 配置文件默认仅支持控制台 + 文件输出 。 如果你要用输出到消息队列 , 就需要用 Logback 原生配置 ,也就是 logback-spring.xmllogback.xml

新建配置文件 logback-spring.xml,路径如下:

Spring Boot 启动时,会自动去 classpath 根目录 (也就是 resources/)下找这个文件。

有此需求再看官方文档或 AI 编写配置吧~

相关推荐
5pace19 小时前
【JavaWeb|第二篇】SpringBoot篇
java·spring boot·后端
HenryLin19 小时前
Kronos核心概念解析
后端
oak隔壁找我19 小时前
Spring AOP源码深度解析
java·后端
货拉拉技术19 小时前
大规模 Kafka 消费集群调度方案
后端
oak隔壁找我19 小时前
MyBatis Plus 源码深度解析
java·后端
oak隔壁找我19 小时前
Druid 数据库连接池源码详细解析
java·数据库·后端
剽悍一小兔19 小时前
Nginx 基本使用配置大全
后端
LCG元20 小时前
性能排查必看!当Linux服务器CPU/内存飙高,如何快速定位并"干掉"罪魁祸首进程?
linux·后端
oak隔壁找我20 小时前
MyBatis 源码深度解析
java·后端
lang2015092820 小时前
Spring 4.1新特性:深度优化与生态整合
java·后端·spring