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 编写配置吧~

相关推荐
西岭千秋雪_3 小时前
RAG核心特性:ETL
数据仓库·人工智能·spring boot·ai编程·etl
karry_k3 小时前
什么是Fork/Join?
java·后端
卷Java3 小时前
小程序前端功能更新说明
java·前端·spring boot·微信小程序·小程序·uni-app
卷Java3 小时前
小程序原生导航栏返回键实现
spring boot·云原生·微信小程序·uni-app
karry_k4 小时前
四大函数式接口与Stream流式计算
后端
Cosolar5 小时前
什么是 ONNX Runtime?
后端·架构
Cosolar5 小时前
榨干每一滴算力:ONNX Runtime 多维优化实战指南
后端·架构
databook5 小时前
Manim实现渐变填充特效
后端·python·动效
come112345 小时前
Go Modules 包管理 (Go 模块)
开发语言·后端·golang