Spring Boot日志常用配置:
# 日志輸出的地址:Spring Boot默認並沒有進行文件輸出,只在控制台中進行了打印 logging.file=/home/zhou # 日志級別 debug-> info -> warning -> error # 默認級別為 info # 如果設置了debug=true的時候,日志級別會自動降低為debug # ROOT代表默認全局設置 logging.level.ROOT=INFO # 可以設置指定包的輸出級別,這樣的話,指定的包,級別以下的日志就不在打印或者寫入日志文件 logging.level.org.springframework=ERROR logging.level.org.apache=ERROR
日志文件默認一天生成一個文件,但是有一個問題,不能分割日志文件。
小項目可以一天生成一個日志文件,但是像淘寶那種級別的可能每分鍾都需要生成一個日志文件,這種情況下,可以使用logback自帶的詳細的配置文件來開發。
注釋掉剛才配置的,把logback.xml文件放到resource目錄下,具體可以去官網:https://logback.qos.ch/
參考:http://www.cnblogs.com/warking/p/5710303.html
logback.xml示例:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑--> <property name="LOG_HOME" value="/home" /> <!-- 控制台輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--按pattern指定的路徑格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符,編碼為UTF-8--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 定義一個日滾動(每天生成一份)的日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名--> <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern> <!--日志文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符,編碼為UTF-8--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!-- 在日滾動文件中,強制只保存錯誤INFO級別以上的信息 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- 定義日志全局最低輸出級別,同時向控制台和日滾動文件輸出 --> <root level="INFO"> <appender-ref ref="console" /> <appender-ref ref="STDOUT" /> </root> </configuration>
參考另一例子:
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds"> <property name="LOG_HOME" value="/tmp"/> <!-- 彩色日志 --> <!-- 彩色日志依賴的渲染類 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- 彩色日志格式 --> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(--){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> /> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> </encoder> </appender> <appender name="LOG_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern> [%date{yyyy-MM-dd HH:mm:ss.SSS}] [ %-5level] %logger{96} - %msg%n </pattern> <charset>UTF-8</charset> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/info_log_%d{yyyyMMdd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>200 MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <maxHistory>2</maxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <prudent>false</prudent> </appender> <appender name="LOG_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern> [%date{yyyy-MM-dd HH:mm:ss.SSS}] [ %-5level] %logger{96} - %msg%n </pattern> <charset>UTF-8</charset> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/error_log_%d{yyyyMMdd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>200 MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <maxHistory>2</maxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <prudent>false</prudent> </appender> <appender name="Sentry" class="com.getsentry.raven.logback.SentryAppender"> <dsn>https://c6fb8bf2a380850a514:1867ceb5621c39b2@sentry.wangjing.cn/15</dsn> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level> </filter> </appender> <logger name="logback.SentryAppenderIT" level="INFO"> <appender-ref ref="Sentry"/> </logger> <root level="INFO"> <appender-ref ref="Console"/> <appender-ref ref="Sentry"/> <appender-ref ref="LOG_INFO"/> <appender-ref ref="LOG_ERROR"/> </root> </configuration>
開發、生產環境切換和自定義配置:
配置文件有properties和yml文件格式,yml格式文件有易讀,易修改,自動分類等優點,可以使用yml格式配置文件(看個人喜好)
application.yml文件示例:
debug: true server: servlet: context-path: app1 spring: http: encoding: charset: utf-8 thymeleaf: cache: true datasource: username: root password: root url: jdbc:mysql://127.0.0.1:3306/test driver-class-name: com.mysql.jdbc.Driver
IDEA開發工具會把開頭相同的, 自動歸類,這樣以后修改的時候,就不用吧配置文件從頭到尾讀一遍,害怕漏了某些配置
如果properties和yml同時存在,以properties文件為准
環境配置,dev開發環境和部署環境連接的數據庫地址、debug模式等等都是不同的,為了區分dev開發環境配置和生產環境配置,可以創建兩個yml文件,什么環境使用相應的配置文件:
- application.yml:公共配置文件,里面可以通過spring.profiles.active=dev來指定使用哪個配置文件
- application-dev.yml:開發環境配置文件
- application-prd.yml:生產環境配置文件
注意:
- 當公共配置文件application.yml和dev.yml(或prd.yml)同時存在同一個配置的時候,以dev.yml(prd.yml)配置文件為主,
- 當配置項只在公共application.yml文件中有的時候,以公共配置為主
- 可以把公共配置項放到application.yml中
日志環境配置有點不一樣:
1. 更改默認的logback.xml為logback-spring.xml
SpringBoot當看到logback-spring.xml文件存在的時候,才會啟動日志的環境切換,而logback.xml文件無法做到
2.在需要切換的環境上,增加springProfile標簽
會根據上面spring.profiles.active指定的值是什么來自動切換
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑--> <springProfile name="dev"> <property name="LOG_HOME" value="/tmp" /> </springProfile> <springProfile name="prd"> <property name="LOG_HOME" value="/home/log" /> </springProfile> .............................
spring boot自定義配置:
Spring Boot 內置的配置項遠遠不能支撐我們的程序運行,在項目設計的時候,往往因為擴展性的需要,項目需要預留很多自定義設置項,Spring Boot 允許我們配置自定義選項。
在Spring Boot 中,有兩種方式使用自定義選項
- @Value單個屬性注入
- @ConfigurationProperties類型安全加載
1. 首先創建一個config.properties配置文件(properties文件一般都是單獨保存我們的配置文件信息的),簡單的寫幾個自定義信息
app.name=淘寶2號店 app.version=1.0.0 app.description=這是一家盜版的淘寶店 # -連接符說明使用的時候,后面的S要大寫(pageSize) app.page-size=20 # 是否顯示廣告 app.show-advert=true app.website=http://www.taobao2.com
2. 注意,我這里使用了中文,properties文件不支持中文,如果想支持中文,需要設置:
file -> settings -> Editor -> File Encodings ,勾選Transparent native-to-ascii conversion選項
3. 自定義配置信息寫好了,但是程序不知道啥玩意啊,需要程序啟動時,加載配置配置信息
@SpringBootApplication @PropertySource("classpath:config.properties") // 在入口類啟動時,加載config.properties public class Test1Application { public static void main(String[] args) { SpringApplication.run(Test1Application.class, args); } }
4.1:@Value方式: 寫一個controller類,測試是否能讀取到自定義配置信息
package com.htmltest.test1.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @Value("${app.name}") private String name; @Value("${app.page-size}") private Integer pageSize; @RequestMapping(value = "/name") public String getAppName(){ return name; } }
搞定!!
現在發現,如果每個Controller類都重復定義一遍,properties里面那么多配置信息,很麻煩,可以使用另外一種方式:
4.2:@ConfigurationProperties方式:創建一個自定義AppConfig類,並且設置set和get方法
package com.htmltest.test1.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component // 這是一個組件類,寫上這個注解,Spring Boot啟動時會加載它 @ConfigurationProperties(prefix = "app") // 將所有app前綴的屬性,自動賦值給對應的Bean屬性 // 比如:name對應app前綴的app.name賦值,pageSize對應app.page-size賦值 public class AppConfig { private String name; private Integer pageSize; private String description; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getPageSize() { return pageSize; } public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public Boolean getShowAdvert() { return showAdvert; } public void setShowAdvert(Boolean showAdvert) { this.showAdvert = showAdvert; } private String version; private Boolean showAdvert; }
這樣的話,每個Controller類中都可以方便的使用了:
@RestController public class MyController { // @Resource 和 @Autowired功能一樣效果 // private AppConfig appConfig; @Autowired private AppConfig appConfig; @RequestMapping(value = "/name") public String getAppName(){ return appConfig.getName(); } }