springboot+logback的多环境配置全过程

 更新时间:2025年09月26日 08:39:44   作者:左边的天堂  
文章介绍了Spring Boot多环境配置的两种方式:推荐使用bootstrap.yml+环境专用文件(如bootstrap-dev.yml)区分配置,而旧版(2.6.x以下)可采用bootstrap.yml+application-xxx.yml,同时说明Logback需将配置文件改为logback-spring.xml以支持springProperty多环境日志设置

一、springboot多环境配置

使用springboot的时候,一般会区分开发、测试、生产环境。而在不同环境部署的时候需要修改对应的配置,如果每次切换都需要手动修改一大堆配置其实很麻烦。

为了方便可以配置多个文件,比如部署测试环境时,只需修改spring.profiles.active为test即可,再如生产环境只需修改spring.profiles.active为prod。其他都不需要改动,这样是不是很方便。

springboot从优先级来讲有两种配置bootstrap.ymlapplication.ymlbootstrap.yml的优先级要高于application.yml

利用这个特点我们可以做很多事,比如利用nacos做为配置中心时,bootstrap.yml可以指定nacosserver-addr

但是区分不同的环境对应nacosserver-addr是不一样的,需要分开不同的文件来配置。我们有两种方式:

  • 第一种(推荐):bootstrap.yml + bootstrap-dev.yml + …
  • 第二种: bootstrap.yml + application-dev.yml + …

第一种方案示例

  • bootstrap.yml配置示例
# Tomcat
server:
  port: 8080

# Spring
spring:
  main:
    # Spring Boot 2.6.3 需要设定,解决循环依赖的问题
    allow-circular-references: true
  application:
    # 应用名称
    name: system
  profiles:
    # 环境配置,可选值:dev、test、prod
    active: dev
  • bootstrap-dev.yml配置示例
# Spring
spring:
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 192.168.1.31:8848
        # 命名空间,非必须,默认是public
        namespace: dev
      config:
        # 配置中心地址
        server-addr: 192.168.1.31:8848
        # 命名空间,非必须,默认是public
        namespace: dev
        # 配置文件格式
        file-extension: yml
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
  • bootstrap-test.yml配置示例
# Spring
spring:
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 192.168.100.8:8848
        # 命名空间,非必须,默认是public
        namespace: test
      config:
        # 配置中心地址
        server-addr: 192.168.100.8:8848
        # 命名空间,非必须,默认是public
        namespace: test
        # 配置文件格式
        file-extension: yml
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

以此类推,bootstrap-prod.yml只需修改server-addrnamespace配置即可。

第二种示例

使用第二种方式只能在Spring Boot 2.6.x以下的版本使用,否则会有循环依赖问题。

还需要在pom.xml文件中添加以下配置:

<packaging>pom</packaging>

如果没有这个,springboot是无法识别application.yml的。配置和第一种一样,此处省略。

二、logback多环境配置

为了能让springProperty的配置生效,需要把logback.xml 修改成 logback-spring.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <springProperty scope="context" name="applicationName" source="spring.application.name"/>
    <!-- 单个日志文件的大小 -->
    <springProperty scope="context" name="maxFileSize" source="logging.file.max-size" defaultValue="20MB"/>
    <!-- 日志保留时长 (天) -->
    <springProperty scope="context" name="maxHistory" source="logging.file.max-history" defaultValue="30"/>
    <!-- 日志文件路径 -->
    <springProperty scope="context" name="log.path" source="logging.path" defaultValue="/logs/${applicationName}"/>

    <contextName>${applicationName}</contextName>

    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- }) %clr(---){faint} %clr([%10t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wex"/>
    <!-- 默认日志输出格式 -->
    <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } --- [%t] %-40.40logger{39} : %m%n%wex"/>

    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8">
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB,这里设置为20MB -->
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--  开发环境和测试环境,日志输出到控制台  -->
    <springProfile name="dev|test">
        <!--控制台和日志文件输出级别-->
        <root level="INFO">
            <appender-ref ref="console"/>
        </root>
    </springProfile>

    <!--  生产环境,日志输出到文件  -->
    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="file_info"/>
            <appender-ref ref="file_error"/>
        </root>
    </springProfile>
</configuration>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MyBatis-Plus速成指南之简化你的数据库操作流程(最新推荐)

    MyBatis-Plus速成指南之简化你的数据库操作流程(最新推荐)

    MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生,这篇文章主要介绍了MyBatis-Plus速成指南:简化你的数据库操作流程,需要的朋友可以参考下
    2025-02-02
  • 详解JAVA类加载机制(推荐)

    详解JAVA类加载机制(推荐)

    这篇文章主要介绍了JAVA类加载机制的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • Java内部排序之插入排序与交换排序详解

    Java内部排序之插入排序与交换排序详解

    这篇文章主要介绍了Java内部排序之插入排序与交换排序详解,排序是将任意序列重新排列按照关键字有序,排序根基存储器的不同分为内部排序、外部排序,排序根据关键字分为稳定排序、不稳定排序,需要的朋友可以参考下
    2023-12-12
  • SpringMVC MethodArgumentResolver的作用与实现

    SpringMVC MethodArgumentResolver的作用与实现

    这篇文章主要介绍了SpringMVC MethodArgumentResolver的作用与实现,MethodArgumentResolver采用一种策略模式,在Handler的方法被调用前,Spring MVC会自动将HTTP请求中的参数转换成方法参数
    2023-04-04
  • java中ThreadLocal和ThreadLocalMap浅析

    java中ThreadLocal和ThreadLocalMap浅析

    这篇文章主要介绍了java中ThreadLocal和ThreadLocalMap浅析,ThreadLocal类用来设置线程私有变量 本身不储存值 主要提供自身引用 和 操作ThreadLocalMap 属性值得方法,需要的朋友可以参考下
    2023-09-09
  • MyBatis OGNL 表达式的避坑指南

    MyBatis OGNL 表达式的避坑指南

    本文主要介绍了MyBatis OGNL 表达式的避坑指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • Kafka常用命令之kafka-console-consumer.sh解读

    Kafka常用命令之kafka-console-consumer.sh解读

    这篇文章主要介绍了Kafka常用命令之kafka-console-consumer.sh解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • SpringCloud zookeeper作为注册中心使用介绍

    SpringCloud zookeeper作为注册中心使用介绍

    ZooKeeper由雅虎研究院开发,是Google Chubby的开源实现,后来托管到Apache,于2010年11月正式成为Apache的顶级项目。ZooKeeper是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务
    2022-11-11
  • FeignClient如何共享Header及踩坑过程记录

    FeignClient如何共享Header及踩坑过程记录

    这篇文章主要介绍了FeignClient如何共享Header及踩坑过程记录,
    2022-03-03
  • 使用Assembly打包和部署SpringBoot工程方式

    使用Assembly打包和部署SpringBoot工程方式

    文章介绍了SpringBoot项目的两种部署方式:Docker容器部署和FatJar直接部署,FatJar部署存在配置文件隐藏和启动脚本复杂的问题,而Assembly打包方式可以解决这些问题,使得SpringBoot能够加载jar外的配置文件并提供服务化的启动脚本
    2024-12-12

最新评论