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();
}
}

