如何在 Spring Boot 项目中使用 @Slf4j 注解结合 Logback 进行系统日志管理

1. 添加依赖

添加 Logback 依赖

Spring Boot 默认使用 Logback 作为日志框架,因此通常不需要额外添加 Logback 依赖。如果你的项目中没有 Logback,可以在 pom.xml 文件中添加以下依赖:

java 复制代码
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>
添加 Lombok 依赖

为了使用 @Slf4j 注解,需要添加 Lombok 依赖。在 pom.xml 文件中添加以下内容:

java 复制代码
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.28</version> <!-- 请使用最新版本 -->
    <scope>provided</scope>
</dependency>

2. 使用 @Slf4j 注解

在类中使用 @Slf4j

在你的类中使用 @Slf4j 注解,Lombok 会自动为你生成一个 Logger 实例。示例如下:

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

@Slf4j
public class Example {
    public static void main(String[] args) {
        log.debug("This is a debug message");
        log.info("This is an info message");
        log.warn("This is a warn message");
        log.error("This is an error message");
    }
}

3. 配置 Logback

创建 logback-spring.xml 文件

src/main/resources 目录下创建 logback-spring.xml 文件。这个文件用于配置 Logback 的日志策略。以下是一个示例配置文件:

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 定义日志文件的存储路径 -->
    <property name="LOG_DIR" value="logs"/>

    <!-- 控制台日志输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 文件日志输出 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>50GB</totalSizeCap>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>500MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 根日志记录器 -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

4. 日志级别控制

application.propertiesapplication.yml 中配置日志级别

你可以在 application.propertiesapplication.yml 文件中配置日志级别。例如:

java 复制代码
# application.properties
logging.level.root=INFO
logging.level.com.example=DEBUG

或者在 application.yml 文件中:

java 复制代码
logging:
  level:
    root: INFO
    com.example: DEBUG

5. 多环境配置

使用 <springProfile> 标签

Logback 支持多环境配置,你可以使用 <springProfile> 标签为不同环境配置不同的日志策略。例如:

java 复制代码
<configuration>
    <property name="LOG_DIR" value="logs"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>50GB</totalSizeCap>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>500MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <springProfile name="dev">
        <root level="DEBUG">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="FILE"/>
        </root>
    </springProfile>

    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="FILE"/>
        </root>
    </springProfile>
</configuration>

6. 日志脱敏

脱敏日志信息

在记录日志时,可能需要对某些敏感信息进行脱敏处理。例如,可以使用正则表达式或自定义方法对日志内容进行处理。以下是一个简单的示例:

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

@Slf4j
public class Example {
    public static void main(String[] args) {
        String sensitiveData = "1234567890";
        String maskedData = maskSensitiveData(sensitiveData);
        log.info("Sensitive data: {}", maskedData);
    }

    private static String maskSensitiveData(String data) {
        if (data == null) {
            return null;
        }
        return data.replaceAll("(?<=\\w{3})\\w(?=\\w{3})", "*");
    }
}

7. 异步日志处理

使用异步日志

对于高并发系统,可以使用异步日志处理来提高性能。Logback 提供了 AsyncAppender 来实现异步日志输出。以下是一个示例配置:

java 复制代码
<configuration>
    <property name="LOG_DIR" value="logs"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>50GB</totalSizeCap>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>500MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE"/>
        <queueSize>512</queueSize>
        <neverBlock>true</neverBlock>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ASYNC"/>
    </root>
</configuration>

8. 最佳实践

日志文件路径

确保日志文件路径(如 logs 目录)在服务器上存在,或者在配置文件中指定正确的路径。

日志级别控制

在生产环境中,建议将日志级别设置为 INFO 或更高,以避免过多的日志输出影响性能。

相关推荐
程序员黑豆16 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
wuyk55517 小时前
第2章:六步换相原理全解+STM32工程实战
c语言·开发语言·stm32·单片机·嵌入式硬件
hey_sml17 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo17 小时前
数据结构-环形链表
java·数据结构·链表
萧瑟余晖18 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才19 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio19 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
萧瑟余晖20 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
不老刘21 小时前
【Java入门】Java服务部署方式全景对比:从java -jar到K8s
java·kubernetes·jar
离陌在学C#1 天前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#