一、springboot
多环境配置
使用springboot的时候,一般会区分开发、测试、生产环境。而在不同环境部署的时候需要修改对应的配置,如果每次切换都需要手动修改一大堆配置其实很麻烦。为了方便可以配置多个文件,比如部署测试环境时,只需修改spring.profiles.active
为test即可,再如生产环境只需修改spring.profiles.active
为prod。其他都不需要改动,这样是不是很方便。
springboot从优先级来讲有两种配置bootstrap.yml
和application.yml
,bootstrap.yml
的优先级要高于application.yml
。利用这个特点我们可以做很多事,比如利用nacos
做为配置中心时,bootstrap.yml
可以指定nacos
的server-addr
。
但是区分不同的环境对应nacos
的server-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-{
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-addr
和namespace
配置即可。
- 第二种示例
使用第二种方式只能在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>