开发者

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

目录
  • 一、springboot多环境配置
    • 第一种方案示例
    • 第二种示例
  • 二、logback多环境配置
    • 总结

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

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

      第一种方案示例

      • 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>
                  </timeBasedFileNamingAndThttp://www.devze.comriggeringPolicy>
              </rollingPolicy>
              <encoder>
                  <pattern>${FILE_LOG_PATTERN}</pattern>
              </encoder>
              <filter class="ch.qos.logback.classic.filter.LevelFilter">
                  <!-- 过滤的级别 -->
                  aNxvTaEqGr<level>INFO</level>
                  <!-- 匹配时的操作:接收(记录) -->
                  <onMatch>ACCEPT</onMatch>
                  <!-- 不匹配时的操作:拒绝(不记录) -->
                  <onMismatch>DENY</onMismatch>
              </filter>
          </appender>
      
          <appender name="file_error" class="ch.qos.logback.core.rolling.R编程客栈ollingFileAppender">
              <!-- 循环政策:基于aNxvTaEqGr时间创建日志文件 -->
              <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>
              </enwww.devze.comcoder>
              <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>
      

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜