SpringBoot多環境開發與日志小結
前置導入
什麼是多環境?其實就是說你的電腦上寫的程序最終要放到別人的服務器上去運行。每個計算機環境不一樣,這就是多環境。常見的多環境開發主要兼顧3種環境設置,開發環境——自己用的,測試環境——自己公司用的,生產環境——甲方爸爸用的。因為這是絕對不同的三臺電腦,所以環境肯定有所不同,比如連接的數據庫不一樣,設置的訪問端口不一樣等等。
多環境開發(yaml單一文件版)
那什麼是多環境開發?就是針對不同的環境設置不同的配置屬性即可。比如你自己開發時,配置你的端口如下:
server: port: 80
如何想設計兩組環境呢?中間使用三個減號分隔開
server: port: 80 --- server: port: 81
如何區分兩種環境呢?起名字唄
spring: profiles: pro server: port: 80 --- spring: profiles: dev server: port: 81
那用哪一個呢?設置默認啟動哪個就可以瞭
spring: profiles: active: pro # 啟動pro --- spring: profiles: pro server: port: 80 --- spring: profiles: dev server: port: 81
就這麼簡單,再多來一組環境也OK
spring: profiles: active: pro # 啟動pro --- spring: profiles: pro server: port: 80 --- spring: profiles: dev server: port: 81 --- spring: profiles: test server: port: 82
其中關於環境名稱定義上述格式是過時格式,標準格式如下
spring: config: activate: on-profile: pro
總結
- 多環境開發需要設置若幹種常用環境,例如開發、生產、測試環境
- yaml格式中設置多環境使用—區分環境設置邊界
- 每種環境的區別在於加載的配置屬性不同
- 啟用某種環境時需要指定啟動時使用該環境
多環境開發(yaml多文件版)
將所有的配置都放在一個配置文件中,尤其是每一個配置應用場景都不一樣,這顯然不合理,於是就有瞭將一個配置文件拆分成多個配置文件的想法。拆分後,每個配置文件中寫自己的配置,主配置文件中寫清楚用哪一個配置文件就好瞭。
主配置文件
spring: profiles: active: pro # 啟動pro
環境配置文件
server: port: 80
環境配置文件因為每一個都是配置自己的項,所以連名字都不用寫裡面瞭。那問題是如何區分這是哪一組配置呢?使用文件名區分。
application-pro.yaml
server: port: 80
application-dev.yaml
server: port: 81
文件的命名規則為:application-環境名.yml
上圖中的application.yml就是我們說的主配置文件,其他的都是環境配置文件。
在配置文件中,如果某些配置項所有環境都一樣,可以將這些項寫入到主配置中,隻有哪些有區別的項才寫入到環境配置文件中。
- 主配置文件中設置公共配置(全局)
- 環境分類配置文件中常用於設置沖突屬性(局部)
總結
- 可以使用獨立配置文件定義環境屬性
- 獨立配置文件便於線上系統維護更新並保障系統安全性
多環境開發(properties多文件版)
SpringBoot最早期提供的配置文件格式是properties格式的,這種格式的多環境配置也可以瞭解一下。
主配置文件
spring.profiles.active=pro
環境配置文件
application-pro.properties
server.port=80
application-dev.properties
server.port=81
文件的命名規則為:application-環境名.properties
總結
properties文件多環境配置僅支持多文件格式
多環境開發獨立配置文件書寫技巧
作為程序員在搞配置的時候往往處於一種分久必合合久必分的局面。開始先寫一起,後來為瞭方便維護就拆分。對於多環境開發也是如此,下面給大傢說一下如何基於多環境開發做配置獨立管理,務必掌握。
準備工作
將所有的配置根據功能對配置文件中的信息進行拆分,並制作成獨立的配置文件,命名規則如下
- application-devDB.yml
- application-devRedis.yml
- application-devMVC.yml
使用
使用include屬性在激活指定環境的情況下,同時對多個環境進行加載使其生效,多個環境間使用逗號分隔
spring: profiles: active: dev include: devDB,devRedis,devMVC
比較一下,現在相當於加載dev配置時,再加載對應的3組配置,從結構上就很清晰,用瞭什麼,對應的名稱是什麼
註意
當主環境dev與其他環境有相同屬性時,主環境屬性生效;其他環境中有相同屬性時,最後加載的環境屬性生效
改良
但是上面的設置也有一個問題,比如我要切換dev環境為pro時,include也要修改。因為include屬性隻能使用一次,這就比較麻煩瞭。SpringBoot從2.4版開始使用group屬性替代include屬性,降低瞭配置書寫量。簡單說就是我先寫好,你愛用哪個用哪個。
spring: profiles: active: dev group: "dev": devDB,devRedis,devMVC "pro": proDB,proRedis,proMVC "test": testDB,testRedis,testMVC
現在再來看,如果切換dev到pro,隻需要改一下是不是就結束瞭?完美!
總結
- 多環境開發使用group屬性設置配置文件分組,便於線上維護管理 多環境開發控制
最後說一個沖突問題。就是maven和SpringBoot同時設置多環境的話怎麼搞。
要想處理這個沖突問題,你要先理清一個關系,究竟誰在多環境開發中其主導地位。也就是說如果現在都設置瞭多環境,誰的應該是保留下來的,另一個應該遵從相同的設置。
maven是做什麼的?項目構建管理的,最終生成代碼包的,SpringBoot是幹什麼的?簡化開發的。簡化,又不是其主導作用。最終還是要靠maven來管理整個工程,所以SpringBoot應該聽maven的。整個確認後下面就好做瞭。大體思想如下:
- 先在maven環境中設置用什麼具體的環境
- 在SpringBoot中讀取maven設置的環境即可
maven中設置多環境(使用屬性方式區分環境)
<profiles> <profile> <id>env_dev</id> <properties> <profile.active>dev</profile.active> </properties> <activation> <activeByDefault>true</activeByDefault> <!--默認啟動環境--> </activation> </profile> <profile> <id>env_pro</id> <properties> <profile.active>pro</profile.active> </properties> </profile> </profiles>
SpringBoot中讀取maven設置值
spring: profiles: active: @profile.active@
上面的@屬性名@就是讀取maven中配置的屬性值的語法格式。
總結
- 當Maven與SpringBoot同時對多環境進行控制時,以Maven為主,SpringBoot使用@…@占位符讀取Maven對應的配置屬性值
- 基於SpringBoot讀取Maven配置屬性的前提下,如果在Idea下測試工程時pom.xml每次更新需要手動compile方可生效(此問題在IDEA21、22版本已經得到解決)
日志前導
日志其實就是記錄程序日常運行的信息,主要作用如下:
- 編程期調試代碼
- 運營期記錄信息
- 記錄日常運營重要信息(峰值流量、平均響應時長……)
- 記錄應用報錯信息(錯誤堆棧)
- 記錄運維過程數據(擴容、宕機、報警……)
日志的使用格式非常固定,直接上操作步驟:
步驟①:添加日志記錄操作
@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"; } }
上述代碼中log對象就是用來記錄日志的對象,下面的log.debug,log.info這些操作就是寫日志的API瞭。
結果:
默認的我們的系統在啟動起來的時候,日志級別是info級別,所以這裡我們隻能看到info以及其上的日志信息
步驟②:設置日志輸出級別
日志設置好以後可以根據設置選擇哪些參與記錄。這裡是根據日志的級別來設置的。日志的級別分為6種,分別是:
- TRACE:運行堆棧信息,使用率低
- DEBUG:程序員調試代碼使用
- INFO:記錄運維過程數據
- WARN:記錄運維過程報警數據
- ERROR:記錄錯誤堆棧信息
- FATAL:災難信息,合並計入ERROR
一般情況下,開發時候使用DEBUG,上線後使用INFO,運維信息記錄使用WARN即可。下面就設置一下日志級別:
# 開啟debug模式,輸出調試信息,常用於檢查系統運行狀況 debug: true
在開啟瞭debug模式之後我們在開啟項目的時候會有大篇幅的文字,這個模式我們一般在項目上線之後的檢測才會使用到。
這麼設置太簡單粗暴瞭,日志系統通常都提供瞭細粒度的控制
# 開啟debug模式,輸出調試信息,常用於檢查系統運行狀況 debug: true # 設置日志級別,root表示根節點,即整體應用日志級別 logging: level: root: debug
我們設置成debug級別之後,再運行就可以看到:
還可以再設置更細粒度的控制(例如我們不想看框架裡面的debug日志)
步驟③:設置日志組,控制指定包對應的日志輸出級別,也可以直接控制指定包對應的日志輸出級別
logging: # 設置日志組 group: # 自定義組名,設置當前組中所包含的包 ebank: com.nefu.controller,com.nefu.service level: root: warn # 為對應組設置日志級別 ebank: debug # 為對包設置日志級別 com.nefu.controller: debug
說白瞭就是總體設置一下,每個包設置一下,如果感覺設置的麻煩,就先把包分個組,對組設置。
總結
- 日志用於記錄開發調試與運維過程消息
- 日志的級別共6種,通常使用4種即可,分別是DEBUG,INFO,WARN,ERROR
- 可以通過日志組或代碼包的形式進行日志顯示級別的控制
寫代碼的時候每個類都要寫創建日志記錄對象,這個可以優化一下,使用前面用過的lombok技術給我們提供的工具類即可。
@RestController @RequestMapping("/books") public class BookController extends BaseClass{ private static final Logger log = LoggerFactory.getLogger(BookController.class); //這一句可以不寫瞭 }
導入lombok後使用註解搞定,日志對象名為log
@Slf4j //這個註解替代瞭下面那一行 @RestController @RequestMapping("/books") public class BookController extends BaseClass{ private static final Logger log = LoggerFactory.getLogger(BookController.class); //這一句可以不寫瞭 }
日志輸出格式控制
日志已經能夠記錄瞭,但是目前記錄的格式是SpringBoot給我們提供的,如果想自定義控制就需要自己設置瞭。先分析一下當前日志的記錄格式。
- PID:進程ID,用於表明當前操作所處的進程,當多服務同時記錄日志時,該值可用於協助程序員調試程序。
- 所屬類/接口名:當前顯示信息為SpringBoot重寫後的信息,名稱過長時,簡化包名書寫為首字母,甚至直接刪除。
對於單條日志信息來說,日期,觸發位置,記錄信息是最核心的信息。級別用於做篩選過濾,PID與線程名用於做精準分析。瞭解這些信息後就可以DIY日志格式瞭。
模擬的官方日志模板的書寫格式:
logging: pattern: console: "%d %clr(%p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"
日志文件
日志信息顯示,記錄已經控制住瞭,下面就要說一下日志的轉存瞭。日志不能僅顯示在控制臺上,要把日志記錄到文件中,方便後期維護查閱。
對於日志文件的使用存在各種各樣的策略,例如每日記錄,分類記錄,報警後記錄等。這裡主要研究日志文件如何記錄。
記錄日志到文件中格式非常簡單,設置日志文件名即可。
logging: file: name: server.log
雖然使用上述格式可以將日志記錄下來瞭,但是面對線上的復雜情況,一個文件記錄肯定是不能夠滿足運維要求的,通常會每天記錄日志文件,同時為瞭便於維護,還要限制每個日志文件的大小。下面給出日志文件的常用配置方式:
logging: logback: rollingpolicy: #代表日志的滾動 max-file-size: 3KB #文件大小限度 file-name-pattern: server.%d{yyyy-MM-dd}.%i.log #滾動日志的文件名怎麼啟
以上格式是基於logback日志技術設置每日日志文件的設置格式,要求容量到達3KB以後就轉存信息到第二個文件中。文件命名規則中的%d標識日期,%i是一個遞增變量,用於區分日志文件。
到此這篇關於SpringBoot多環境開發與日志的文章就介紹到這瞭,更多相關SpringBoot多環境開發內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot框架配置文件路徑設置方式
- SpringBoot 日志的配置及輸出應用教程
- Maven的porfile與SpringBoot的profile結合使用案例詳解
- SpringBoot 動態配置Profile環境的方式
- springboot配置開發和測試環境並添加啟動路徑方式