springboot+logback的多環(huán)境配置全過程
一、springboot多環(huán)境配置
使用springboot的時候,一般會區(qū)分開發(fā)、測試、生產(chǎn)環(huán)境。而在不同環(huán)境部署的時候需要修改對應(yīng)的配置,如果每次切換都需要手動修改一大堆配置其實很麻煩。
為了方便可以配置多個文件,比如部署測試環(huán)境時,只需修改spring.profiles.active為test即可,再如生產(chǎn)環(huán)境只需修改spring.profiles.active為prod。其他都不需要改動,這樣是不是很方便。
springboot從優(yōu)先級來講有兩種配置bootstrap.yml和application.yml,bootstrap.yml的優(yōu)先級要高于application.yml。
利用這個特點我們可以做很多事,比如利用nacos做為配置中心時,bootstrap.yml可以指定nacos的server-addr。
但是區(qū)分不同的環(huán)境對應(yīng)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 需要設(shè)定,解決循環(huán)依賴的問題
allow-circular-references: true
application:
# 應(yīng)用名稱
name: system
profiles:
# 環(huán)境配置,可選值:dev、test、prod
active: dev
bootstrap-dev.yml配置示例
# Spring
spring:
cloud:
nacos:
discovery:
# 服務(wù)注冊地址
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:
# 服務(wù)注冊地址
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-addr和namespace配置即可。
第二種示例
使用第二種方式只能在Spring Boot 2.6.x以下的版本使用,否則會有循環(huán)依賴問題。
還需要在pom.xml文件中添加以下配置:
<packaging>pom</packaging>
如果沒有這個,springboot是無法識別application.yml的。配置和第一種一樣,此處省略。
二、logback多環(huán)境配置
為了能讓springProperty的配置生效,需要把logback.xml 修改成 logback-spring.xml,內(nèi)容如下:
<?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>
<!-- 系統(tǒng)日志輸出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 循環(huán)政策:基于時間創(chuàng)建日志文件 -->
<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">
<!-- 循環(huán)政策:基于時間創(chuàng)建日志文件 -->
<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,這里設(shè)置為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>
<!-- 開發(fā)環(huán)境和測試環(huán)境,日志輸出到控制臺 -->
<springProfile name="dev|test">
<!--控制臺和日志文件輸出級別-->
<root level="INFO">
<appender-ref ref="console"/>
</root>
</springProfile>
<!-- 生產(chǎn)環(huán)境,日志輸出到文件 -->
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</springProfile>
</configuration>
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis-Plus速成指南之簡化你的數(shù)據(jù)庫操作流程(最新推薦)
MyBatis-Plus?是一個?MyBatis?的增強工具,在?MyBatis?的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)、提高效率而生,這篇文章主要介紹了MyBatis-Plus速成指南:簡化你的數(shù)據(jù)庫操作流程,需要的朋友可以參考下2025-02-02
SpringMVC MethodArgumentResolver的作用與實現(xiàn)
這篇文章主要介紹了SpringMVC MethodArgumentResolver的作用與實現(xiàn),MethodArgumentResolver采用一種策略模式,在Handler的方法被調(diào)用前,Spring MVC會自動將HTTP請求中的參數(shù)轉(zhuǎn)換成方法參數(shù)2023-04-04
java中ThreadLocal和ThreadLocalMap淺析
這篇文章主要介紹了java中ThreadLocal和ThreadLocalMap淺析,ThreadLocal類用來設(shè)置線程私有變量?本身不儲存值?主要提供自身引用?和?操作ThreadLocalMap?屬性值得方法,需要的朋友可以參考下2023-09-09
Kafka常用命令之kafka-console-consumer.sh解讀
這篇文章主要介紹了Kafka常用命令之kafka-console-consumer.sh解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
SpringCloud zookeeper作為注冊中心使用介紹
ZooKeeper由雅虎研究院開發(fā),是Google Chubby的開源實現(xiàn),后來托管到Apache,于2010年11月正式成為Apache的頂級項目。ZooKeeper是一個經(jīng)典的分布式數(shù)據(jù)一致性解決方案,致力于為分布式應(yīng)用提供一個高性能、高可用,且具有嚴格順序訪問控制能力的分布式協(xié)調(diào)服務(wù)2022-11-11

