不學無數——SpringBoot入門IV
SpringBoot
1.Profiles
Spring Profiles能夠在不同的環境中使不同的應用配置生效。@Component和@Configuration兩個註解都能夠通過@Profiles來標記。下面是例子:
@Configuration
@Profile("buxuewushu")
public class ProductionConfiguration {
// ...
}
在配置檔案中可以通過spring.profiles.active這個變數來控制哪個Profiles生效。例如,可以在application.properties配置檔案中配置如下:
spring.profiles.active=buxuewushu1,buxuewushu --即通過@Profiles註解標記的名為buxuewushu和buxuewushu1的檔案生效
當然也可以通過命令列的形式進行配置:--spring.profiles.active= buxuewushu1, buxuewushu
1.1在程式碼中配置
在啟動檔案執行之前可以通過SpringApplication設定需要使哪一個配置生效,SpringApplication.setAdditionalProfiles(…),也可以通過Spring的ConfigurableEnvironment介面來配置。
2.日誌
SpringBoot使用 **Commons Logging**作為內部的日誌門面,但是也提供了一系列的介面來實現擴充套件。預設的日誌配置有,Java Util Logging,Log4J2和[Logback] (https://commons.apache.org/proper/commons-logging/),在這每一種的實現下,都能通過配置來實現針對於哪一些日誌的輸出。
2.1日誌的格式
SpringBoot預設的日誌輸出格式如下所示,預設輸出級別是INFO。預設使用的是Logback進行記錄日誌的。
2018-07-20 19:11:40.046 INFO 21758 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot [email protected]db57326: startup date [Fri Jul 20 19:11:38 CST 2018]; root of context hierarchy
2018-07-20 19:11:40.093 INFO 21758 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto java.lang.String com.example.FirstSpringBoot.FirstSpringBootApplication.home()
2018-07-20 19:11:40.097 INFO 21758 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2018-07-20 19:11:40.097 INFO 21758 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
- 時間:非常精確的時間,並且是根據時間進行排序的輸出順序。
- 日誌級別:ERROR,WARN,INFO,DEBUG,TRANCE
- 程序ID
- 通過---進行分割,右邊為實際的日誌輸出內容
- 執行緒名
- 日誌名稱:通常是源類的名稱
- 日誌的內容
2.2調整日誌級別
SpringBoot預設的日誌級別是INFO,如果想列印其他級別的日誌的話可以通過配置。日誌級別的順序是ERROR>WARN>INFO>DEBUG>TRANCE.第一種辦法是通過在啟動的時候進行引數的配置--debug。
$ java -jar myapp.jar --debug
當然也可以通過配置檔案的形式進行調整級別。debug=true,即輸出為DEBUG級別的日誌資訊。
2.3在檔案中記錄日誌
預設情況下,SpringBoot僅僅在控制檯中列印日誌,不會將日誌記錄在檔案中。如果想將日誌輸出在檔案中的話,那麼可以在配置檔案中配置檔案的路徑。logging.file或者logging.path.下面介紹logging.file和logging.path的區別。
logging.file | logging.path | 例子 | 描述 |
---|---|---|---|
none | none | none | 僅僅在控制檯中輸出日誌 |
檔名 | none | buxuewushu.log | 會在專案的根目錄下生成一個buxuewushu.log來記錄日誌 |
none | 資料夾的名字 | ./logs | 會在專案的根目錄中生成一個logs資料夾,logs檔案下會生成預設的spring.log來記錄日誌 |
當日志文件記錄的資料達到一定量時,SpringBoot會將此檔案進行壓縮為.gz的壓縮檔案。SpringBoot預設的大小為10M。當然這個大小也可以通過logging.file.max-size進行配置,但是必須得帶單位。
2.4自定義日誌配置
許多的日誌系統能夠被相應的配置檔案所配置,或者通過在application.properties中配置Spring的環境變數進行配置logging.config。
可以通過org.springframework.boot.logging.LoggingSystem的系統變數的設定從而使用特定的日誌系統,系統日誌的value值應該是日誌實現的全路徑名。
由於日誌的載入是在ApplicationContext建立之前的,所以不能通過@PropertySources和@Configuration進行配置。唯一的配置方式就是在系統的環境變數中。
不同的日誌系統所對應的配置檔案如下:
日誌名 | 檔名 |
---|---|
Logback | logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
Java Util Logging在可執行jar包執行時,可能會造成類載入的問題,所以儘可能避免在jar包執行時使用Java Util Logging
為了更好配置化,一些在properties中的配置被轉化為了配置在系統中的變數。對應關係如下:
Spring配置變數 | 系統變數 | 描述 |
---|---|---|
logging.exception-conversion-word | LOG_EXCEPTION_CONVERSION_WORD | 記錄異常時使用的轉換字 |
logging.file | LOG_FILE | 用於預設日誌配置在哪個檔案中 |
logging.path | LOG_PATH | 用於預設日誌配置資料夾下 |
logging.file.max-size | LOG_FILE_MAX_SIZE | 日誌檔案中支援的最大容量 |
logging.file.max-history | LOG_FILE_MAX_HISTORY | 最大的已經被壓縮的檔案的數量 |
logging.pattern.console | CONSOLE_LOG_PATTERN | 在控制檯上使用的日誌模式 |
PID | PID | 當前的程序ID(如果可能,還沒有被定義為OS環境變數時發現) |
2.5 Logback的擴充套件
SpringBoot為Logback的可擴充套件性提供了許多的幫助。能夠在logback-spring.xml檔案中進行配置想要擴充套件的內容。
由於logback.xml檔案的載入時間太早了,所以不能講擴充套件的內容配置在logback.xml中。
通常在開發過程中,我們根據不同的環境進行配置不同的日誌級別。所以在配置檔案中可以通過<springProfile>標籤進行有選擇的使具體哪一步分生效。例子如下,在logback-spring.xml進行配置
--想要的配置的具體內容在<springProfile>標籤中進行編寫
<springProfile name="staging">
<!-- 配置staging生效 -->
</springProfile>
<springProfile name="dev | staging">
<!-- 配置dev或者staging生效 -->
</springProfile>
<springProfile name="!production">
<!-- 配置除了production之外的生效 -->
</springProfile>