SpringBoot多環(huán)境開發(fā)與日志小結(jié)
前置導(dǎo)入
什么是多環(huán)境?其實(shí)就是說你的電腦上寫的程序最終要放到別人的服務(wù)器上去運(yùn)行。每個(gè)計(jì)算機(jī)環(huán)境不一樣,這就是多環(huán)境。常見的多環(huán)境開發(fā)主要兼顧3種環(huán)境設(shè)置,開發(fā)環(huán)境——自己用的,測(cè)試環(huán)境——自己公司用的,生產(chǎn)環(huán)境——甲方爸爸用的。因?yàn)檫@是絕對(duì)不同的三臺(tái)電腦,所以環(huán)境肯定有所不同,比如連接的數(shù)據(jù)庫(kù)不一樣,設(shè)置的訪問端口不一樣等等。

多環(huán)境開發(fā)(yaml單一文件版)
那什么是多環(huán)境開發(fā)?就是針對(duì)不同的環(huán)境設(shè)置不同的配置屬性即可。比如你自己開發(fā)時(shí),配置你的端口如下:
server: port: 80
? 如何想設(shè)計(jì)兩組環(huán)境呢?中間使用三個(gè)減號(hào)分隔開
server: port: 80 --- server: port: 81
? 如何區(qū)分兩種環(huán)境呢?起名字唄
spring: profiles: pro server: port: 80 --- spring: profiles: dev server: port: 81
? 那用哪一個(gè)呢?設(shè)置默認(rèn)啟動(dòng)哪個(gè)就可以了
spring: profiles: active: pro # 啟動(dòng)pro --- spring: profiles: pro server: port: 80 --- spring: profiles: dev server: port: 81
? 就這么簡(jiǎn)單,再多來一組環(huán)境也OK
spring: profiles: active: pro # 啟動(dòng)pro --- spring: profiles: pro server: port: 80 --- spring: profiles: dev server: port: 81 --- spring: profiles: test server: port: 82
? 其中關(guān)于環(huán)境名稱定義上述格式是過時(shí)格式,標(biāo)準(zhǔn)格式如下
spring:
config:
activate:
on-profile: pro總結(jié)
- 多環(huán)境開發(fā)需要設(shè)置若干種常用環(huán)境,例如開發(fā)、生產(chǎn)、測(cè)試環(huán)境
- yaml格式中設(shè)置多環(huán)境使用—區(qū)分環(huán)境設(shè)置邊界
- 每種環(huán)境的區(qū)別在于加載的配置屬性不同
- 啟用某種環(huán)境時(shí)需要指定啟動(dòng)時(shí)使用該環(huán)境
多環(huán)境開發(fā)(yaml多文件版)
將所有的配置都放在一個(gè)配置文件中,尤其是每一個(gè)配置應(yīng)用場(chǎng)景都不一樣,這顯然不合理,于是就有了將一個(gè)配置文件拆分成多個(gè)配置文件的想法。拆分后,每個(gè)配置文件中寫自己的配置,主配置文件中寫清楚用哪一個(gè)配置文件就好了。
主配置文件
spring: profiles: active: pro # 啟動(dòng)pro
環(huán)境配置文件
server: port: 80
? 環(huán)境配置文件因?yàn)槊恳粋€(gè)都是配置自己的項(xiàng),所以連名字都不用寫里面了。那問題是如何區(qū)分這是哪一組配置呢?使用文件名區(qū)分。
application-pro.yaml
server: port: 80
application-dev.yaml
server: port: 81
? 文件的命名規(guī)則為:application-環(huán)境名.yml

上圖中的application.yml就是我們說的主配置文件,其他的都是環(huán)境配置文件。
? 在配置文件中,如果某些配置項(xiàng)所有環(huán)境都一樣,可以將這些項(xiàng)寫入到主配置中,只有哪些有區(qū)別的項(xiàng)才寫入到環(huán)境配置文件中。
- 主配置文件中設(shè)置公共配置(全局)
- 環(huán)境分類配置文件中常用于設(shè)置沖突屬性(局部)
總結(jié)
- 可以使用獨(dú)立配置文件定義環(huán)境屬性
- 獨(dú)立配置文件便于線上系統(tǒng)維護(hù)更新并保障系統(tǒng)安全性
多環(huán)境開發(fā)(properties多文件版)
SpringBoot最早期提供的配置文件格式是properties格式的,這種格式的多環(huán)境配置也可以了解一下。
主配置文件
spring.profiles.active=pro
環(huán)境配置文件
application-pro.properties
server.port=80
application-dev.properties
server.port=81
? 文件的命名規(guī)則為:application-環(huán)境名.properties
總結(jié)
properties文件多環(huán)境配置僅支持多文件格式 多環(huán)境開發(fā)獨(dú)立配置文件書寫技巧
? 作為程序員在搞配置的時(shí)候往往處于一種分久必合合久必分的局面。開始先寫一起,后來為了方便維護(hù)就拆分。對(duì)于多環(huán)境開發(fā)也是如此,下面給大家說一下如何基于多環(huán)境開發(fā)做配置獨(dú)立管理,務(wù)必掌握。
準(zhǔn)備工作
? 將所有的配置根據(jù)功能對(duì)配置文件中的信息進(jìn)行拆分,并制作成獨(dú)立的配置文件,命名規(guī)則如下
- application-devDB.yml
- application-devRedis.yml
- application-devMVC.yml
使用
? 使用include屬性在激活指定環(huán)境的情況下,同時(shí)對(duì)多個(gè)環(huán)境進(jìn)行加載使其生效,多個(gè)環(huán)境間使用逗號(hào)分隔
spring:
profiles:
active: dev
include: devDB,devRedis,devMVC? 比較一下,現(xiàn)在相當(dāng)于加載dev配置時(shí),再加載對(duì)應(yīng)的3組配置,從結(jié)構(gòu)上就很清晰,用了什么,對(duì)應(yīng)的名稱是什么
注意
? 當(dāng)主環(huán)境dev與其他環(huán)境有相同屬性時(shí),主環(huán)境屬性生效;其他環(huán)境中有相同屬性時(shí),最后加載的環(huán)境屬性生效
改良
? 但是上面的設(shè)置也有一個(gè)問題,比如我要切換dev環(huán)境為pro時(shí),include也要修改。因?yàn)閕nclude屬性只能使用一次,這就比較麻煩了。SpringBoot從2.4版開始使用group屬性替代include屬性,降低了配置書寫量。簡(jiǎn)單說就是我先寫好,你愛用哪個(gè)用哪個(gè)。
spring:
profiles:
active: dev
group:
"dev": devDB,devRedis,devMVC
"pro": proDB,proRedis,proMVC
"test": testDB,testRedis,testMVC? 現(xiàn)在再來看,如果切換dev到pro,只需要改一下是不是就結(jié)束了?完美!
總結(jié)
- 多環(huán)境開發(fā)使用group屬性設(shè)置配置文件分組,便于線上維護(hù)管理 多環(huán)境開發(fā)控制
最后說一個(gè)沖突問題。就是maven和SpringBoot同時(shí)設(shè)置多環(huán)境的話怎么搞。
? 要想處理這個(gè)沖突問題,你要先理清一個(gè)關(guān)系,究竟誰在多環(huán)境開發(fā)中其主導(dǎo)地位。也就是說如果現(xiàn)在都設(shè)置了多環(huán)境,誰的應(yīng)該是保留下來的,另一個(gè)應(yīng)該遵從相同的設(shè)置。
? maven是做什么的?項(xiàng)目構(gòu)建管理的,最終生成代碼包的,SpringBoot是干什么的?簡(jiǎn)化開發(fā)的。簡(jiǎn)化,又不是其主導(dǎo)作用。最終還是要靠maven來管理整個(gè)工程,所以SpringBoot應(yīng)該聽maven的。整個(gè)確認(rèn)后下面就好做了。大體思想如下:
- 先在maven環(huán)境中設(shè)置用什么具體的環(huán)境
- 在SpringBoot中讀取maven設(shè)置的環(huán)境即可
maven中設(shè)置多環(huán)境(使用屬性方式區(qū)分環(huán)境)
<profiles>
<profile>
<id>env_dev</id>
<properties>
<profile.active>dev</profile.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault> <!--默認(rèn)啟動(dòng)環(huán)境-->
</activation>
</profile>
<profile>
<id>env_pro</id>
<properties>
<profile.active>pro</profile.active>
</properties>
</profile>
</profiles>
SpringBoot中讀取maven設(shè)置值
spring:
profiles:
active: @profile.active@? 上面的@屬性名@就是讀取maven中配置的屬性值的語(yǔ)法格式。

總結(jié)
- 當(dāng)Maven與SpringBoot同時(shí)對(duì)多環(huán)境進(jìn)行控制時(shí),以Maven為主,SpringBoot使用@…@占位符讀取Maven對(duì)應(yīng)的配置屬性值
- 基于SpringBoot讀取Maven配置屬性的前提下,如果在Idea下測(cè)試工程時(shí)pom.xml每次更新需要手動(dòng)compile方可生效(此問題在IDEA21、22版本已經(jīng)得到解決)
日志前導(dǎo)
日志其實(shí)就是記錄程序日常運(yùn)行的信息,主要作用如下:
- 編程期調(diào)試代碼
- 運(yùn)營(yíng)期記錄信息
- 記錄日常運(yùn)營(yíng)重要信息(峰值流量、平均響應(yīng)時(shí)長(zhǎng)……)
- 記錄應(yīng)用報(bào)錯(cuò)信息(錯(cuò)誤堆棧)
- 記錄運(yùn)維過程數(shù)據(jù)(擴(kuò)容、宕機(jī)、報(bào)警……)
日志的使用格式非常固定,直接上操作步驟:
步驟①:添加日志記錄操作
@RestController
@RequestMapping("/books")
public class BookController extends BaseClass{
private static final Logger log = LoggerFactory.getLogger(BookController.class);
@GetMapping
public String getById(){
log.debug("debug...");
log.info("info...");
log.warn("warn...");
log.error("error...");
return "springboot is running...2";
}
}
? 上述代碼中l(wèi)og對(duì)象就是用來記錄日志的對(duì)象,下面的log.debug,log.info這些操作就是寫日志的API了。
結(jié)果:

默認(rèn)的我們的系統(tǒng)在啟動(dòng)起來的時(shí)候,日志級(jí)別是info級(jí)別,所以這里我們只能看到info以及其上的日志信息
步驟②:設(shè)置日志輸出級(jí)別
? 日志設(shè)置好以后可以根據(jù)設(shè)置選擇哪些參與記錄。這里是根據(jù)日志的級(jí)別來設(shè)置的。日志的級(jí)別分為6種,分別是:
- TRACE:運(yùn)行堆棧信息,使用率低
- DEBUG:程序員調(diào)試代碼使用
- INFO:記錄運(yùn)維過程數(shù)據(jù)
- WARN:記錄運(yùn)維過程報(bào)警數(shù)據(jù)
- ERROR:記錄錯(cuò)誤堆棧信息
- FATAL:災(zāi)難信息,合并計(jì)入ERROR
? 一般情況下,開發(fā)時(shí)候使用DEBUG,上線后使用INFO,運(yùn)維信息記錄使用WARN即可。下面就設(shè)置一下日志級(jí)別:
# 開啟debug模式,輸出調(diào)試信息,常用于檢查系統(tǒng)運(yùn)行狀況 debug: true
在開啟了debug模式之后我們?cè)陂_啟項(xiàng)目的時(shí)候會(huì)有大篇幅的文字,這個(gè)模式我們一般在項(xiàng)目上線之后的檢測(cè)才會(huì)使用到。
? 這么設(shè)置太簡(jiǎn)單粗暴了,日志系統(tǒng)通常都提供了細(xì)粒度的控制
# 開啟debug模式,輸出調(diào)試信息,常用于檢查系統(tǒng)運(yùn)行狀況
debug: true
# 設(shè)置日志級(jí)別,root表示根節(jié)點(diǎn),即整體應(yīng)用日志級(jí)別
logging:
level:
root: debug我們?cè)O(shè)置成debug級(jí)別之后,再運(yùn)行就可以看到:

? 還可以再設(shè)置更細(xì)粒度的控制(例如我們不想看框架里面的debug日志)
步驟③:設(shè)置日志組,控制指定包對(duì)應(yīng)的日志輸出級(jí)別,也可以直接控制指定包對(duì)應(yīng)的日志輸出級(jí)別
logging:
# 設(shè)置日志組
group:
# 自定義組名,設(shè)置當(dāng)前組中所包含的包
ebank: com.nefu.controller,com.nefu.service
level:
root: warn
# 為對(duì)應(yīng)組設(shè)置日志級(jí)別
ebank: debug
# 為對(duì)包設(shè)置日志級(jí)別
com.nefu.controller: debug? 說白了就是總體設(shè)置一下,每個(gè)包設(shè)置一下,如果感覺設(shè)置的麻煩,就先把包分個(gè)組,對(duì)組設(shè)置。
總結(jié)
- 日志用于記錄開發(fā)調(diào)試與運(yùn)維過程消息
- 日志的級(jí)別共6種,通常使用4種即可,分別是DEBUG,INFO,WARN,ERROR
- 可以通過日志組或代碼包的形式進(jìn)行日志顯示級(jí)別的控制
寫代碼的時(shí)候每個(gè)類都要寫創(chuàng)建日志記錄對(duì)象,這個(gè)可以優(yōu)化一下,使用前面用過的lombok技術(shù)給我們提供的工具類即可。
@RestController
@RequestMapping("/books")
public class BookController extends BaseClass{
private static final Logger log = LoggerFactory.getLogger(BookController.class); //這一句可以不寫了
}
? 導(dǎo)入lombok后使用注解搞定,日志對(duì)象名為log
@Slf4j //這個(gè)注解替代了下面那一行
@RestController
@RequestMapping("/books")
public class BookController extends BaseClass{
private static final Logger log = LoggerFactory.getLogger(BookController.class); //這一句可以不寫了
}
日志輸出格式控制
日志已經(jīng)能夠記錄了,但是目前記錄的格式是SpringBoot給我們提供的,如果想自定義控制就需要自己設(shè)置了。先分析一下當(dāng)前日志的記錄格式。

- PID:進(jìn)程ID,用于表明當(dāng)前操作所處的進(jìn)程,當(dāng)多服務(wù)同時(shí)記錄日志時(shí),該值可用于協(xié)助程序員調(diào)試程序。
- 所屬類/接口名:當(dāng)前顯示信息為SpringBoot重寫后的信息,名稱過長(zhǎng)時(shí),簡(jiǎn)化包名書寫為首字母,甚至直接刪除。
? 對(duì)于單條日志信息來說,日期,觸發(fā)位置,記錄信息是最核心的信息。級(jí)別用于做篩選過濾,PID與線程名用于做精準(zhǔn)分析。了解這些信息后就可以DIY日志格式了。

模擬的官方日志模板的書寫格式:
logging:
pattern:
console: "%d %clr(%p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"日志文件
日志信息顯示,記錄已經(jīng)控制住了,下面就要說一下日志的轉(zhuǎn)存了。日志不能僅顯示在控制臺(tái)上,要把日志記錄到文件中,方便后期維護(hù)查閱。
? 對(duì)于日志文件的使用存在各種各樣的策略,例如每日記錄,分類記錄,報(bào)警后記錄等。這里主要研究日志文件如何記錄。
? 記錄日志到文件中格式非常簡(jiǎn)單,設(shè)置日志文件名即可。
logging:
file:
name: server.log? 雖然使用上述格式可以將日志記錄下來了,但是面對(duì)線上的復(fù)雜情況,一個(gè)文件記錄肯定是不能夠滿足運(yùn)維要求的,通常會(huì)每天記錄日志文件,同時(shí)為了便于維護(hù),還要限制每個(gè)日志文件的大小。下面給出日志文件的常用配置方式:
logging:
logback:
rollingpolicy: #代表日志的滾動(dòng)
max-file-size: 3KB #文件大小限度
file-name-pattern: server.%d{yyyy-MM-dd}.%i.log #滾動(dòng)日志的文件名怎么啟? 以上格式是基于logback日志技術(shù)設(shè)置每日日志文件的設(shè)置格式,要求容量到達(dá)3KB以后就轉(zhuǎn)存信息到第二個(gè)文件中。文件命名規(guī)則中的%d標(biāo)識(shí)日期,%i是一個(gè)遞增變量,用于區(qū)分日志文件。
到此這篇關(guān)于SpringBoot多環(huán)境開發(fā)與日志的文章就介紹到這了,更多相關(guān)SpringBoot多環(huán)境開發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對(duì)比Java講解Kotlin中?.與!!.的區(qū)別
這篇文章主要給大家介紹了關(guān)于對(duì)比Java,實(shí)例講解Kotlin中?.與!!.的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用kotlin具有一定參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
Java中如何將符號(hào)分隔的文本文件txt轉(zhuǎn)換為excel
這篇文章主要介紹了Java中如何將符號(hào)分隔的文本文件txt轉(zhuǎn)換為excel,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
SpringCloud解決Feign異步回調(diào)問題(SpringBoot+Async+Future實(shí)現(xiàn))
這篇文章主要介紹了SpringCloud解決Feign異步回調(diào)問題(SpringBoot+Async+Future實(shí)現(xiàn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
PowerJob LockService方法工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob LockService方法工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Spring自動(dòng)裝配bean的方式總結(jié)
這篇主要介紹了Spring自動(dòng)裝配Bean的方式總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2024-01-01
Spring?Boot與Spring?MVC?Spring對(duì)比及核心概念
這篇文章主要為大家介紹了Spring?Boot與Spring?MVC?Spring的對(duì)比以及你需要了解的核心概念,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03

