SpringBoot多環(huán)境開(kāi)發(fā)與日志小結(jié)
前置導(dǎo)入
什么是多環(huán)境?其實(shí)就是說(shuō)你的電腦上寫(xiě)的程序最終要放到別人的服務(wù)器上去運(yùn)行。每個(gè)計(jì)算機(jī)環(huán)境不一樣,這就是多環(huán)境。常見(jiàn)的多環(huán)境開(kāi)發(fā)主要兼顧3種環(huán)境設(shè)置,開(kāi)發(fā)環(huán)境——自己用的,測(cè)試環(huán)境——自己公司用的,生產(chǎn)環(huán)境——甲方爸爸用的。因?yàn)檫@是絕對(duì)不同的三臺(tái)電腦,所以環(huán)境肯定有所不同,比如連接的數(shù)據(jù)庫(kù)不一樣,設(shè)置的訪問(wèn)端口不一樣等等。
多環(huán)境開(kāi)發(fā)(yaml單一文件版)
那什么是多環(huán)境開(kāi)發(fā)?就是針對(duì)不同的環(huán)境設(shè)置不同的配置屬性即可。比如你自己開(kāi)發(fā)時(shí),配置你的端口如下:
server: port: 80
? 如何想設(shè)計(jì)兩組環(huán)境呢?中間使用三個(gè)減號(hào)分隔開(kāi)
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)單,再多來(lái)一組環(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)境名稱(chēng)定義上述格式是過(guò)時(shí)格式,標(biāo)準(zhǔn)格式如下
spring: config: activate: on-profile: pro
總結(jié)
- 多環(huán)境開(kāi)發(fā)需要設(shè)置若干種常用環(huán)境,例如開(kāi)發(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)境開(kāi)發(fā)(yaml多文件版)
將所有的配置都放在一個(gè)配置文件中,尤其是每一個(gè)配置應(yīng)用場(chǎng)景都不一樣,這顯然不合理,于是就有了將一個(gè)配置文件拆分成多個(gè)配置文件的想法。拆分后,每個(gè)配置文件中寫(xiě)自己的配置,主配置文件中寫(xiě)清楚用哪一個(gè)配置文件就好了。
主配置文件
spring: profiles: active: pro # 啟動(dòng)pro
環(huán)境配置文件
server: port: 80
? 環(huán)境配置文件因?yàn)槊恳粋€(gè)都是配置自己的項(xiàng),所以連名字都不用寫(xiě)里面了。那問(wèn)題是如何區(qū)分這是哪一組配置呢?使用文件名區(qū)分。
application-pro.yaml
server: port: 80
application-dev.yaml
server: port: 81
? 文件的命名規(guī)則為:application-環(huán)境名.yml
上圖中的application.yml就是我們說(shuō)的主配置文件,其他的都是環(huán)境配置文件。
? 在配置文件中,如果某些配置項(xiàng)所有環(huán)境都一樣,可以將這些項(xiàng)寫(xiě)入到主配置中,只有哪些有區(qū)別的項(xiàng)才寫(xiě)入到環(huán)境配置文件中。
- 主配置文件中設(shè)置公共配置(全局)
- 環(huán)境分類(lèi)配置文件中常用于設(shè)置沖突屬性(局部)
總結(jié)
- 可以使用獨(dú)立配置文件定義環(huán)境屬性
- 獨(dú)立配置文件便于線(xiàn)上系統(tǒng)維護(hù)更新并保障系統(tǒng)安全性
多環(huán)境開(kāi)發(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)境開(kāi)發(fā)獨(dú)立配置文件書(shū)寫(xiě)技巧
? 作為程序員在搞配置的時(shí)候往往處于一種分久必合合久必分的局面。開(kāi)始先寫(xiě)一起,后來(lái)為了方便維護(hù)就拆分。對(duì)于多環(huán)境開(kāi)發(fā)也是如此,下面給大家說(shuō)一下如何基于多環(huán)境開(kāi)發(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)的名稱(chēng)是什么
注意
? 當(dāng)主環(huán)境dev與其他環(huán)境有相同屬性時(shí),主環(huán)境屬性生效;其他環(huán)境中有相同屬性時(shí),最后加載的環(huán)境屬性生效
改良
? 但是上面的設(shè)置也有一個(gè)問(wèn)題,比如我要切換dev環(huán)境為pro時(shí),include也要修改。因?yàn)閕nclude屬性只能使用一次,這就比較麻煩了。SpringBoot從2.4版開(kāi)始使用group屬性替代include屬性,降低了配置書(shū)寫(xiě)量。簡(jiǎn)單說(shuō)就是我先寫(xiě)好,你愛(ài)用哪個(gè)用哪個(gè)。
spring: profiles: active: dev group: "dev": devDB,devRedis,devMVC "pro": proDB,proRedis,proMVC "test": testDB,testRedis,testMVC
? 現(xiàn)在再來(lái)看,如果切換dev到pro,只需要改一下是不是就結(jié)束了?完美!
總結(jié)
- 多環(huán)境開(kāi)發(fā)使用group屬性設(shè)置配置文件分組,便于線(xiàn)上維護(hù)管理 多環(huán)境開(kāi)發(fā)控制
最后說(shuō)一個(gè)沖突問(wèn)題。就是maven和SpringBoot同時(shí)設(shè)置多環(huán)境的話(huà)怎么搞。
? 要想處理這個(gè)沖突問(wèn)題,你要先理清一個(gè)關(guān)系,究竟誰(shuí)在多環(huán)境開(kāi)發(fā)中其主導(dǎo)地位。也就是說(shuō)如果現(xiàn)在都設(shè)置了多環(huán)境,誰(shuí)的應(yīng)該是保留下來(lái)的,另一個(gè)應(yīng)該遵從相同的設(shè)置。
? maven是做什么的?項(xiàng)目構(gòu)建管理的,最終生成代碼包的,SpringBoot是干什么的?簡(jiǎn)化開(kāi)發(fā)的。簡(jiǎn)化,又不是其主導(dǎo)作用。最終還是要靠maven來(lái)管理整個(gè)工程,所以SpringBoot應(yīng)該聽(tī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方可生效(此問(wèn)題在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)維過(guò)程數(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ì)象就是用來(lái)記錄日志的對(duì)象,下面的log.debug,log.info這些操作就是寫(xiě)日志的API了。
結(jié)果:
默認(rèn)的我們的系統(tǒng)在啟動(dòng)起來(lái)的時(shí)候,日志級(jí)別是info級(jí)別,所以這里我們只能看到info以及其上的日志信息
步驟②:設(shè)置日志輸出級(jí)別
? 日志設(shè)置好以后可以根據(jù)設(shè)置選擇哪些參與記錄。這里是根據(jù)日志的級(jí)別來(lái)設(shè)置的。日志的級(jí)別分為6種,分別是:
- TRACE:運(yùn)行堆棧信息,使用率低
- DEBUG:程序員調(diào)試代碼使用
- INFO:記錄運(yùn)維過(guò)程數(shù)據(jù)
- WARN:記錄運(yùn)維過(guò)程報(bào)警數(shù)據(jù)
- ERROR:記錄錯(cuò)誤堆棧信息
- FATAL:災(zāi)難信息,合并計(jì)入ERROR
? 一般情況下,開(kāi)發(fā)時(shí)候使用DEBUG,上線(xiàn)后使用INFO,運(yùn)維信息記錄使用WARN即可。下面就設(shè)置一下日志級(jí)別:
# 開(kāi)啟debug模式,輸出調(diào)試信息,常用于檢查系統(tǒng)運(yùn)行狀況 debug: true
在開(kāi)啟了debug模式之后我們?cè)陂_(kāi)啟項(xiàng)目的時(shí)候會(huì)有大篇幅的文字,這個(gè)模式我們一般在項(xiàng)目上線(xiàn)之后的檢測(cè)才會(huì)使用到。
? 這么設(shè)置太簡(jiǎn)單粗暴了,日志系統(tǒng)通常都提供了細(xì)粒度的控制
# 開(kāi)啟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
? 說(shuō)白了就是總體設(shè)置一下,每個(gè)包設(shè)置一下,如果感覺(jué)設(shè)置的麻煩,就先把包分個(gè)組,對(duì)組設(shè)置。
總結(jié)
- 日志用于記錄開(kāi)發(fā)調(diào)試與運(yùn)維過(guò)程消息
- 日志的級(jí)別共6種,通常使用4種即可,分別是DEBUG,INFO,WARN,ERROR
- 可以通過(guò)日志組或代碼包的形式進(jìn)行日志顯示級(jí)別的控制
寫(xiě)代碼的時(shí)候每個(gè)類(lèi)都要寫(xiě)創(chuàng)建日志記錄對(duì)象,這個(gè)可以?xún)?yōu)化一下,使用前面用過(guò)的lombok技術(shù)給我們提供的工具類(lèi)即可。
@RestController @RequestMapping("/books") public class BookController extends BaseClass{ private static final Logger log = LoggerFactory.getLogger(BookController.class); //這一句可以不寫(xiě)了 }
? 導(dǎo)入lombok后使用注解搞定,日志對(duì)象名為log
@Slf4j //這個(gè)注解替代了下面那一行 @RestController @RequestMapping("/books") public class BookController extends BaseClass{ private static final Logger log = LoggerFactory.getLogger(BookController.class); //這一句可以不寫(xiě)了 }
日志輸出格式控制
日志已經(jīng)能夠記錄了,但是目前記錄的格式是SpringBoot給我們提供的,如果想自定義控制就需要自己設(shè)置了。先分析一下當(dāng)前日志的記錄格式。
- PID:進(jìn)程ID,用于表明當(dāng)前操作所處的進(jìn)程,當(dāng)多服務(wù)同時(shí)記錄日志時(shí),該值可用于協(xié)助程序員調(diào)試程序。
- 所屬類(lèi)/接口名:當(dāng)前顯示信息為SpringBoot重寫(xiě)后的信息,名稱(chēng)過(guò)長(zhǎng)時(shí),簡(jiǎn)化包名書(shū)寫(xiě)為首字母,甚至直接刪除。
? 對(duì)于單條日志信息來(lái)說(shuō),日期,觸發(fā)位置,記錄信息是最核心的信息。級(jí)別用于做篩選過(guò)濾,PID與線(xiàn)程名用于做精準(zhǔn)分析。了解這些信息后就可以DIY日志格式了。
模擬的官方日志模板的書(shū)寫(xiě)格式:
logging: pattern: console: "%d %clr(%p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"
日志文件
日志信息顯示,記錄已經(jīng)控制住了,下面就要說(shuō)一下日志的轉(zhuǎn)存了。日志不能僅顯示在控制臺(tái)上,要把日志記錄到文件中,方便后期維護(hù)查閱。
? 對(duì)于日志文件的使用存在各種各樣的策略,例如每日記錄,分類(lèi)記錄,報(bào)警后記錄等。這里主要研究日志文件如何記錄。
? 記錄日志到文件中格式非常簡(jiǎn)單,設(shè)置日志文件名即可。
logging: file: name: server.log
? 雖然使用上述格式可以將日志記錄下來(lái)了,但是面對(duì)線(xiàn)上的復(fù)雜情況,一個(gè)文件記錄肯定是不能夠滿(mǎn)足運(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)境開(kāi)發(fā)與日志的文章就介紹到這了,更多相關(guān)SpringBoot多環(huán)境開(kāi)發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之圖的基礎(chǔ)概念和數(shù)據(jù)模型詳解
在現(xiàn)實(shí)生活中,有許多應(yīng)用場(chǎng)景會(huì)包含很多點(diǎn)以及點(diǎn)點(diǎn)之間的連接,而這些應(yīng)用場(chǎng)景我們都可以用即將要學(xué)習(xí)的圖這種數(shù)據(jù)結(jié)構(gòu)去解決。本文主要介紹了圖的基礎(chǔ)概念和數(shù)據(jù)模型,感興趣的可以了解一下2022-11-11使用java代碼代替xml實(shí)現(xiàn)SSM教程
這篇文章主要介紹了使用java代碼代替xml實(shí)現(xiàn)SSM教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12springboot整合 beatlsql的實(shí)例代碼
這篇文章主要介紹了springboot整合 beatlsql的實(shí)例代碼,BeetSql是一個(gè)全功能DAO工具,同時(shí)具有hibernate 優(yōu)點(diǎn) & Mybatis優(yōu)點(diǎn)功能,有興趣的可以了解一下2017-05-05Java使用Sharding-JDBC分庫(kù)分表進(jìn)行操作
Sharding-JDBC 是無(wú)侵入式的 MySQL 分庫(kù)分表操作工具,本文主要介紹了Java使用Sharding-JDBC分庫(kù)分表進(jìn)行操作,感興趣的可以了解一下2021-08-08把Jar文件轉(zhuǎn)成exe安裝文件的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇把Jar文件轉(zhuǎn)成exe安裝文件的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11java利用Apache commons codec進(jìn)行MD5加密,BASE64加密解密,執(zhí)行系統(tǒng)命令
這篇文章主要介紹了java利用apache Commons包進(jìn)行MD5加密,BASE64加密解密與執(zhí)行系統(tǒng)命令希望對(duì)大家有用2017-12-12java遠(yuǎn)程連接調(diào)用Rabbitmq的實(shí)例代碼
本篇文章主要介紹了java遠(yuǎn)程連接調(diào)用Rabbitmq的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07