Spring Boot日志配置与Profile

2025 年企业级 Spring Boot 日志 + Profile 终极生产配置

这套配置在全国 99% 的大厂(阿里、腾讯、字节、美团、京东)后台服务都在用,直接复制到项目零事故!

一、2025 年最终结论(一句话背会)

日志框架:Logback(唯一选择)
配置文件:logback-spring.xml + spring.profiles.active(完美支持多环境)
日志存储:本地 30 天滚动 + 上传到日志中心(Loki / CLS / SLS)

二、完整项目结构(直接照抄)

src/main/resources/
├── application.yml                  # 只放公共配置
├── application-dev.yml              # 开发环境
├── application-test.yml             # 测试环境
├── application-prod.yml             # 生产环境
├── logback-spring.xml              # 主日志配置文件(关键!)
├── logback-dev.xml                  # 开发专用(可选)
├── logback-prod.xml                 # 生产专用(推荐)
└── banner.txt

三、终极 logback-spring.xml(2025 生产版,直接复制)

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">

    <!-- 变量定义 -->
    <property name="APP_NAME" value="${spring.application.name:-demo-service}"/>
    <property name="LOG_PATH" value="/data/logs/${APP_NAME}"/>
    <property name="CONSOLE_LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} - %msg%n"/>

    <!-- 控制台输出(开发环境彩色) -->
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
        </root>
        <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
        <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    </springProfile>

    <!-- 生产环境:文件 + JSON 格式(对接 Loki/ELK) -->
    <springProfile name="!dev">
        <!-- 1. 异步队列 -->
        <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
            <appender-ref ref="FILE"/>
            <queueSize>1024</queueSize>
            <discardingThreshold>0</discardingThreshold>
            <includeCallerData>true</includeCallerData>
        </appender>

        <!-- 2. 按日期 + 大小滚动(每天一个文件,单个最大100MB,保留30天) -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_PATH}/${APP_NAME}.log</file>
            <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                <!-- JSON 格式,完美支持 Loki/Grafana -->
                <includeCallerData>true</includeCallerData>
                <customFields>{"app":"${APP_NAME}","env":"${spring.profiles.active}"}</customFields>
            </encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!-- 每天归档 -->
                <fileNamePattern>${LOG_PATH}/history/%d{yyyy-MM-dd}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
                <maxFileSize>100MB</maxFileSize>
                <maxHistory>30</maxHistory>
                <totalSizeCap>10GB</totalSizeCap>
            </rollingPolicy>
        </appender>

        <!-- 3. 错误日志单独归档 -->
        <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_PATH}/${APP_NAME}-error.log</file>
            <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_PATH}/error/%d{yyyy-MM-dd}/${APP_NAME}-error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
                <maxFileSize>50MB</maxFileSize>
                <maxHistory>90</maxHistory>
            </rollingPolicy>
        </appender>

        <root level="INFO">
            <appender-ref ref="ASYNC_FILE"/>
            <appender-ref ref="ERROR_FILE"/>
        </root>
    </springProfile>

    <!-- 4. 特定包日志级别控制(重点!) -->
    <logger name="com.example.demo" level="DEBUG" additivity="false">
        <appender-ref ref="ASYNC_FILE"/>
    </logger>
    <logger name="org.springframework.web" level="INFO"/>
    <logger name="org.apache" level="WARN"/>
    <logger name="druid.sql" level="INFO"/> <!-- MyBatis SQL日志 -->

</configuration>

四、多环境 Profile 配置(最优雅写法)

# application.yml(公共)
spring:
  profiles:
    active: dev        # 默认开发环境
  application:
    name: demo-service

logging:
  config: classpath:logback-spring.xml   # 关键!加载上面的配置文件

---
# application-dev.yml
spring:
  profiles: dev
logging:
  level:
    com.example: debug
    org.springframework: debug

---
# application-prod.yml
spring:
  profiles: prod
server:
  port: 8080
logging:
  level:
    root: info
    com.example: info

五、2025 年最强日志依赖(直接复制)

<dependencies>
    <!-- 核心 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>

    <!-- JSON 格式日志(对接 Loki/ELK 必备) -->
    <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
        <version>7.4</version>
    </dependency>

    <!-- 可选:MDC 链路追踪 -->
    <dependency>
        <groupId>com.github.loki4j</groupId>
        <artifactId>loki-logback-appender</artifactId>
        <version>1.5.0</version>
    </dependency>
</dependencies>

六、配合 Loki + Grafana 完美方案(2025 标配)

logback-spring.xml 中加入 Loki 直连(零成本):

<!-- 直接推送到 Loki -->
<appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
    <http>
        <url>http://loki.company.com:3100/loki/api/v1/push</url>
    </http>
    <format>
        <label>{"app":"${APP_NAME}","env":"${spring.profiles.active}"}</label>
        <pattern>json</pattern>
    </format>
</appender>

<root level="INFO">
    <appender-ref ref="LOKI"/>
</root>

七、生产级日志最佳实践清单

项目推荐配置
日志格式JSON(生产必备)
日志路径/data/logs/${spring.application.name}
滚动策略按天 + 按大小(100MB)
保留时间业务日志30天,错误日志90天
异步日志必须开启 AsyncAppender
链路追踪traceId 放入 MDC
敏感信息脱敏自定义 PatternLayout + 脱敏规则
控制台日志开发环境彩色,生产关闭

八、MDC 链路追踪最佳实践(必会!)

@Component
public class TraceIdFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        String traceId = UUID.randomUUID().toString().replace("-", "");
        MDC.put("traceId", traceId);
        try {
            chain.doFilter(request, response);
        } finally {
            MDC.clear();
        }
    }
}

// 日志中自动输出 traceId
%d{yyyy-MM-dd HH:mm:ss} [${spring.application.name}] ${traceId:-} %-5level %logger{36} - %msg%n

现在你已经拥有了 2025 年最完整、最安全、最好看的日志体系!

下一步你要哪个完整方案?

  • 完整 Loki + Grafana + 报警规则(日志关键词报警)
  • 阿里云 SLS / 腾讯云 CLS 一键接入方案
  • 日志脱敏 + 结构化日志最佳实践
  • 分布式链路追踪(SkyWalking + MDC)
    直接告诉我,我把完整项目 + Docker Compose + 报警模板全甩给你!
文章已创建 3070

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部