SpringBoot log打印及输出方式是什么

发布时间:2021-11-22 14:01:37 作者:iii
来源:亿速云 阅读:376
# 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桥接)

二、基础日志打印方式

2.1 日志对象创建

推荐使用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);
}

2.2 日志级别使用

SpringBoot支持以下日志级别(从低到高):

  1. TRACE:最详细的跟踪信息
log.trace("Detailed trace information");
  1. DEBUG:调试应用程序流程
log.debug("Processing request with ID: {}", requestId);
  1. INFO:关键业务信息(默认级别)
log.info("User {} logged in successfully", username);
  1. WARN:潜在问题警告
log.warn("Cache size approaching limit: {}", currentSize);
  1. ERROR:错误事件(需人工干预)
log.error("Failed to process transaction", exception);

2.3 日志输出最佳实践

  1. 参数化日志:避免字符串拼接
// 推荐
log.debug("User {} with age {} logged in", name, age);

// 不推荐
log.debug("User " + name + " with age " + age + " logged in");
  1. 异常日志:包含完整堆栈
try {
    // business logic
} catch (Exception ex) {
    log.error("Failed to process order", ex);  // 注意第二个参数
}

三、日志配置详解

3.1 application.properties配置

基础配置示例:

# 全局日志级别
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

3.2 自定义logback配置

创建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>

3.3 Profile特定配置

使用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>

四、高级日志功能

4.1 MDC(Mapped Diagnostic Context)

实现请求级日志追踪:

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>

4.2 结构化日志(JSON输出)

配置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>

4.3 日志监控与管理

  1. Actuator端点
management.endpoint.loggers.enabled=true
management.endpoints.web.exposure.include=loggers
  1. 动态修改日志级别
curl -X POST http://localhost:8080/actuator/loggers/com.example \
-H "Content-Type: application/json" \
-d '{"configuredLevel":"DEBUG"}'

五、生产环境最佳实践

5.1 日志收集方案

  1. ELK Stack

    • Filebeat收集日志
    • Logstash处理
    • Elasticsearch存储
    • Kibana展示
  2. EFK Stack

    • Fluentd替代Logstash

5.2 性能优化建议

  1. 使用异步日志(AsyncAppender)
  2. 控制日志输出量:
    
    logging.level.org.hibernate.SQL=DEBUG
    logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
    
  3. 避免生产环境打印过细日志

5.3 安全注意事项

  1. 避免记录敏感信息:
    
    // 错误示例
    log.info("User login with password: {}", password);
    
  2. 设置合理的日志文件权限
  3. 日志脱敏处理

六、常见问题排查

6.1 日志不输出检查清单

  1. 检查logging.level配置
  2. 确认没有多个日志框架冲突
  3. 检查配置文件位置(classpath根目录)
  4. 查看是否有过滤器过滤了日志

6.2 日志文件不滚动

  1. 检查磁盘空间
  2. 确认文件写入权限
  3. 检查maxHistorytotalSizeCap配置

七、总结

SpringBoot提供了灵活强大的日志系统,开发者应该:

  1. 根据环境选择合适的日志级别
  2. 采用合理的日志格式和输出策略
  3. 实现关键业务操作的完整日志追踪
  4. 建立完善的日志收集和分析体系

通过合理配置和规范使用,日志系统将成为系统可观测性的重要组成部分,为开发调试、线上问题排查和业务分析提供有力支持。

注意:本文基于SpringBoot 2.7.x版本编写,不同版本可能存在细微差异。生产环境部署前建议进行充分测试。 “`

推荐阅读:
  1. springboot支付项目之日志配置
  2. 详解Springboot日志如何开启SLF4J

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot log

上一篇:Python有哪些导入模块的方式

下一篇:c语言怎么实现含递归清场版扫雷游戏

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》