springboot+logback的多环境配置

简介: 使用springboot的时候,一般会区分开发、测试、生产环境。而在不同环境部署的时候需要修改对应的配置,如果每次切换都需要手动修改一大堆配置其实很麻烦。为了方便可以配置多个文件,比如部署测试环境时,只需修改spring.profiles.active为test即可,再如生产环境只需修改spring.profiles.active为prod。其他都不需要改动,这样是不是很方便。

一、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 + ...

image.png

  1. 第一种方案示例:
    • 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-{
   
   mathJaxContainer[0]}{
   
   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-{
   
   mathJaxContainer[1]}{
   
   spring.cloud.nacos.config.file-extension}

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

  1. 第二种示例

使用第二种方式只能在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>
相关文章
|
存储 Java Spring
Spring动态自定义logback日志目录
Spring动态自定义logback日志目录 @Date 2018.10.18 问题场景 在业务开发中, 遇到一个场景. 日志目录需要根据不同的一个业务id存储.
3071 0
|
9月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
1181 3
|
9月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
650 4
|
缓存 JSON 前端开发
第07课:Spring Boot集成Thymeleaf模板引擎
第07课:Spring Boot集成Thymeleaf模板引擎
1009 0
第07课:Spring Boot集成Thymeleaf模板引擎
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1442 0
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
1355 0
|
Prometheus 监控 Cloud Native
Spring Boot 可视化监控
本文介绍了如何通过Spring Actuator、Micrometer、Prometheus和Grafana为Spring Boot应用程序添加监控功能。首先创建了一个Spring Boot应用,并配置了Spring Actuator以暴露健康状态和指标接口。接着,利用Micrometer收集应用性能数据,并通过Prometheus抓取这些数据进行存储。最后,使用Grafana将Prometheus中的数据可视化,展示在精美的仪表板上。整个过程简单易行,为Spring Boot应用提供了基本的监控能力,同时也为后续扩展更详细的监控指标奠定了基础。
1894 2
|
Java Spring
SpringBoot自动配置原理
本文深入解析了SpringBoot的核心功能——自动配置,重点探讨了`org.springframework.boot.autoconfigure`及相关注解的工作机制。通过分析`@SpringBootApplication`、`@EnableAutoConfiguration`等注解,揭示了SpringBoot如何基于类路径和条件自动装配Bean
750 9
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
1192 0
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
1119 0