目录

Spring Boot 日志深度解析:从入门到精通

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解 Lombok 请看: Lombok 入门到精通:告别冗余代码

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】...等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力

✨更多文章请看个人主页: 码熔burning


一、Spring Boot日志系统概述

1.1 日志框架

Spring Boot默认使用 SLF4J(Simple Logging Facade for Java) 作为日志抽象层,而具体的日志实现默认是 Logback

  • SLF4J:提供统一的日志接口,屏蔽不同日志框架(如Log4j、Log4j2、Logback)的差异。
  • Logback:高效、灵活的日志实现,是Log4j的改进版,由同一作者开发。
1.2 日志级别

Spring Boot支持以下日志级别(按严重性从低到高排序):

  • TRACE:调试详细信息,通常用于跟踪程序执行流程。
  • DEBUG:调试信息,用于开发阶段。
  • INFO:一般信息,如系统启动、关键操作。
  • WARN:警告信息,表示潜在问题但不影响程序运行。
  • ERROR:错误信息,表示程序出现严重问题。
1.3 日志输出位置

默认情况下,日志输出到 控制台。可以通过配置文件修改输出到文件或其他位置。


二、快速入门:使用日志

2.1 添加依赖

Spring Boot默认已包含日志依赖,无需额外添加。如果需要切换日志框架(如Log4j2),需排除默认依赖。

2.2 在代码中使用日志

通过@Slf4j注解(Lombok)或手动创建Logger实例:

java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyService {
    private static final Logger log = LoggerFactory.getLogger(MyService.class);

    public void doSomething() {
        log.debug("This is a debug message");
        log.info("This is an info message");
        log.error("This is an error message", new RuntimeException("Sample error"));
    }
}

使用Lombok简化代码:

java 复制代码
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MyService {
    public void doSomething() {
        log.debug("This is a debug message");
    }
}

三、配置日志(application.properties/yml)

3.1 基础配置

src/main/resources/application.propertiesapplication.yml中配置日志行为。

application.properties示例:

properties 复制代码
# 设置全局日志级别(根日志级别)
logging.level.root=INFO

# 设置特定包或类的日志级别
logging.level.com.example=DEBUG
logging.level.org.springframework.web=ERROR

# 输出日志到文件(默认控制台)
logging.file.name=app.log
# 或指定路径
logging.file.path=/var/log/myapp

application.yml示例:

yaml 复制代码
logging:
  level:
    root: INFO
    com.example: DEBUG
    org.springframework.web: ERROR
  file:
    name: app.log
3.2 控制台输出格式

默认格式为:

复制代码
2023-10-01 12:34:56.789  INFO 12345 --- [main] com.example.MyService : This is an info message
3.3 文件滚动策略

通过logging.file配置文件名,Spring Boot会自动处理文件滚动(按时间或大小分割文件)。

默认滚动策略:

  • 最大文件大小:10MB
  • 最多保留7个文件

可自定义滚动策略(需配置Logback的logback-spring.xml,见下一节)。


四、高级配置:自定义Logback配置

4.1 创建logback-spring.xml

src/main/resources目录下创建logback-spring.xml,覆盖默认配置。

4.2 基本结构
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 文件输出 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>app.log</file>
        <encoder>
            <pattern>%d %level [%thread] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 日志级别配置 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>
4.3 自定义日志格式

通过<encoder>pattern属性定义日志格式:

  • %d:时间戳
  • %level:日志级别
  • %thread:线程名
  • %logger:日志记录器名称
  • %msg:日志消息
  • %n:换行符

示例格式:

xml 复制代码
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
4.4 文件滚动策略

使用RollingFileAppender实现按大小或时间滚动:

xml 复制代码
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>app.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- 按天滚动,保留7天 -->
        <fileNamePattern>app.%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>7</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>%d %level [%thread] %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

五、切换日志框架(如Log4j2)

5.1 排除默认Logback依赖

pom.xml中排除Spring Boot的默认日志依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
5.2 添加Log4j2依赖
xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
5.3 配置Log4j2

创建log4j2-spring.xmlsrc/main/resources目录:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

六、动态调整日志级别

6.1 使用Spring Boot Actuator

添加依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

启用/actuator/loggers端点:

properties 复制代码
management.endpoints.web.exposure.include=loggers

通过HTTP请求动态调整日志级别:

bash 复制代码
# 查看当前日志级别
curl http://localhost:8080/actuator/loggers/com.example

# 设置日志级别为DEBUG
curl -X POST -H "Content-Type: application/json" -d '{"configuredLevel": "DEBUG"}' http://localhost:8080/actuator/loggers/com.example

七、常见问题与解决方案

7.1 日志配置未生效
  • 确保配置文件名正确(application.propertiesapplication.yml)。
  • 检查是否有多个日志框架依赖冲突(如同时引入Logback和Log4j)。
  • 如果使用logback-spring.xml,确保文件路径正确。
7.2 日志输出重复

可能是多个Appender配置了相同输出,检查logback-spring.xml中的Appender引用。

7.3 日志文件过大

配置滚动策略(如按大小分割文件):

xml 复制代码
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>app.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <maxFileSize>10MB</maxFileSize>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
        <!-- 省略编码配置 -->
    </encoder>
</appender>

八、示例代码

8.1 创建Spring Boot项目
bash 复制代码
mvn archetype:generate -DgroupId=com.example -DartifactId=logging-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
8.2 添加依赖(pom.xml)
xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>
8.3 主类
java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class LoggingDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(LoggingDemoApplication.class, args);
    }
}
8.4 服务类
java 复制代码
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MyService {
    public void doSomething() {
        log.trace("Trace message");
        log.debug("Debug message");
        log.info("Info message");
        log.warn("Warning message");
        log.error("Error message", new RuntimeException("Sample exception"));
    }
}
8.5 测试日志输出

main方法中调用服务:

java 复制代码
public static void main(String[] args) {
    SpringApplication.run(LoggingDemoApplication.class, args);
    new MyService().doSomething();
}

九、总结

Spring Boot的日志系统通过SLF4J和Logback提供了灵活的配置能力,支持控制台、文件输出、动态调整日志级别等。关键步骤包括:

  1. 基础配置 :通过application.properties设置日志级别和文件路径。
  2. 高级配置 :通过logback-spring.xml自定义格式和滚动策略。
  3. 切换框架:如需使用Log4j2,需排除默认依赖并引入新框架。
  4. 动态调整:利用Actuator端点实时修改日志行为。

通过以上步骤,你可以完全掌控Spring Boot应用的日志输出,满足不同场景的需求。

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
法欧特斯卡雷特1 分钟前
Kotlin 中那些无法复现的 Java 写法
android·后端·程序员
Re2752 分钟前
springboot自动配置原理1--自动包规则原理
spring boot·spring
小学仔4 分钟前
# 动态规划解决单词拆分问题详解
java·算法·leetcode·矩阵·动态规划
齐 飞5 分钟前
JVM垃圾回收笔记01-垃圾回收算法
java·jvm·笔记
fliter6 分钟前
消息队列性能比拼: Kafka vs RabbitMQ
后端
程序员爱钓鱼10 分钟前
在 Nuxt 3 中实现和使用 SEO 数据:通过 useState 管理全局 SEO 信息
vue.js·后端·nuxt.js
Tony8813 分钟前
深入理解 Java Deque:替代 Stack 的现代解决方案
java
兮动人16 分钟前
Java线程池怎么调整线程大小最合适
后端
-借我杀死庸碌的情怀-19 分钟前
【leetcode刷题记录】(java)数组 链表 哈希表
java·leetcode·链表·哈希
Tony8820 分钟前
Java Deque 方法全解析:从基础操作到方法对比
java