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.properties 或 application.yml 中配置日志级别
你可以在 application.properties 或 application.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 或更高,以避免过多的日志输出影响性能。
