您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# SpringBoot日志打印及输出方式详解
## 一、SpringBoot日志体系概述
SpringBoot作为当前主流的Java开发框架,其日志系统基于SLF4J(Simple Logging Facade for Java)门面设计,默认实现采用Logback。这种设计提供了以下优势:
1. **统一的日志门面**:开发者通过SLF4J API编程,底层可灵活切换具体实现
2. **自动配置**:SpringBoot提供智能的默认配置
3. **模块化设计**:各组件日志通过桥接器统一到SLF4J
### 1.1 日志组件依赖关系
```xml
<!-- 典型SpringBoot项目的日志依赖关系 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
该starter自动引入: - logback-classic (包含SLF4J和Logback核心) - jul-to-slf4j (Java Util Logging桥接) - log4j-to-slf4j (Log4j2桥接)
推荐使用Lombok的@Slf4j
注解:
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class UserService {
public void createUser() {
log.info("Creating new user...");
}
}
传统创建方式:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserService {
private static final Logger log = LoggerFactory.getLogger(UserService.class);
}
SpringBoot支持以下日志级别(从低到高):
log.trace("Detailed trace information");
log.debug("Processing request with ID: {}", requestId);
log.info("User {} logged in successfully", username);
log.warn("Cache size approaching limit: {}", currentSize);
log.error("Failed to process transaction", exception);
// 推荐
log.debug("User {} with age {} logged in", name, age);
// 不推荐
log.debug("User " + name + " with age " + age + " logged in");
try {
// business logic
} catch (Exception ex) {
log.error("Failed to process order", ex); // 注意第二个参数
}
基础配置示例:
# 全局日志级别
logging.level.root=INFO
# 包级别日志
logging.level.com.example.demo=DEBUG
logging.level.org.springframework=WARN
# 文件输出配置
logging.file.name=app.log
logging.file.max-size=10MB
logging.file.max-history=7
# 控制台输出格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
# 文件输出格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
创建logback-spring.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!-- 环境变量读取 -->
<springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
</encoder>
</appender>
<!-- 文件滚动输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/${APP_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 异步日志 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>512</queueSize>
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="FILE"/>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ASYNC"/>
</root>
</configuration>
使用logback-spring.xml
支持Profile:
<springProfile name="dev">
<logger name="com.example" level="DEBUG"/>
</springProfile>
<springProfile name="prod">
<logger name="com.example" level="INFO"/>
<root level="WARN">
<appender-ref ref="FILE"/>
</root>
</springProfile>
实现请求级日志追踪:
import org.slf4j.MDC;
// 过滤器中使用
public class LogFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
MDC.put("traceId", UUID.randomUUID().toString());
try {
chain.doFilter(request, response);
} finally {
MDC.clear();
}
}
}
// 日志格式配置
<pattern>%d{yyyy-MM-dd} [%X{traceId}] %msg%n</pattern>
配置JSON格式日志:
<appender name="JSON" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"app":"${APP_NAME}","env":"${spring.profiles.active}"}</customFields>
</encoder>
</appender>
management.endpoint.loggers.enabled=true
management.endpoints.web.exposure.include=loggers
curl -X POST http://localhost:8080/actuator/loggers/com.example \
-H "Content-Type: application/json" \
-d '{"configuredLevel":"DEBUG"}'
ELK Stack:
EFK Stack:
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
// 错误示例
log.info("User login with password: {}", password);
logging.level
配置maxHistory
和totalSizeCap
配置SpringBoot提供了灵活强大的日志系统,开发者应该:
通过合理配置和规范使用,日志系统将成为系统可观测性的重要组成部分,为开发调试、线上问题排查和业务分析提供有力支持。
注意:本文基于SpringBoot 2.7.x版本编写,不同版本可能存在细微差异。生产环境部署前建议进行充分测试。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。