一、Spring Boot 入門
1就珠、Spring Boot 簡介
簡化Spring應(yīng)用開發(fā)的一個框架瞬沦;
整個Spring技術(shù)棧的一個大整合;
J2EE開發(fā)的一站式解決方案剿另;
2箫锤、微服務(wù)
2014,martin fowler
微服務(wù):架構(gòu)風(fēng)格(服務(wù)微化)
一個應(yīng)用應(yīng)該是一組小型服務(wù)驰弄;可以通過HTTP的方式進(jìn)行互通麻汰;
單體應(yīng)用:ALL IN ONE
微服務(wù):每一個功能元素最終都是一個可獨(dú)立替換和獨(dú)立升級的軟件單元;
3戚篙、環(huán)境準(zhǔn)備
環(huán)境約束
- jdk1.8:Spring Boot 推薦jdk1.7及以上五鲫;java version "1.8.0_112"
- maven3.x:maven 3.3以上版本;Apache Maven 3.3.9
- IntelliJIDEA2017:IntelliJ IDEA 2017.2.2 x64岔擂、STS
- SpringBoot 1.5.9.RELEASE:1.5.9位喂;
3.1、MAVEN設(shè)置乱灵;
給maven 的settings.xml配置文件的profiles標(biāo)簽添加
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
3.2塑崖、IDEA設(shè)置
整合maven進(jìn)來;
4痛倚、Spring Boot HelloWorld
一個功能:
瀏覽器發(fā)送hello請求规婆,服務(wù)器接受請求并處理,響應(yīng)Hello World字符串蝉稳;
4.1抒蚜、創(chuàng)建一個maven工程;(jar)
4.2耘戚、導(dǎo)入spring boot相關(guān)的依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
4.3嗡髓、編寫一個主程序:啟動Spring Boot應(yīng)用
/**
* @Author: cuzz
* @Date: 2018/9/20 18:06
* @Description: @SpringBootApplication 來標(biāo)注一個主程序,說明這是一個SpringBoot應(yīng)用
*/
@SpringBootApplication
public class Application {
public static void main(String[] args) {
// Spring應(yīng)用啟動起來
SpringApplication.run(Application.class, args);
}
}
4.4收津、編寫相關(guān)的Controller饿这、Service
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello(){
return "Hello World!";
}
}
4.5、運(yùn)行主程序測試
直接右鍵runApplication
4.6撞秋、簡化部署
在pom/xml文件引用插件
<!-- 這個插件长捧,可以將應(yīng)用打包成一個可執(zhí)行的jar包;-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
導(dǎo)入這個maven插件部服,利用idea打包唆姐,生成的jar包,可以使用java -jar xxx.jar
啟動
Spring Boot 使用嵌入式的Tomcat無需再配置Tomcat
5廓八、使用Spring Initializer快速創(chuàng)建Spring Boot項目
5.1奉芦、IDEA:使用 Spring Initializer快速創(chuàng)建項目
IDE都支持使用Spring的項目創(chuàng)建向?qū)Э焖賱?chuàng)建一個Spring Boot項目;
選擇我們需要的模塊剧蹂;向?qū)?lián)網(wǎng)創(chuàng)建Spring Boot項目声功;
默認(rèn)生成的Spring Boot項目;
- 主程序已經(jīng)生成好了宠叼,我們只需要我們自己的邏輯
- resources文件夾中目錄結(jié)構(gòu)
- static:保存所有的靜態(tài)資源先巴; js css images;
- templates:保存所有的模板頁面冒冬;(Spring Boot默認(rèn)jar包使用嵌入式的Tomcat伸蚯,默認(rèn)不支持JSP頁面);可以使用模板引擎(freemarker简烤、thymeleaf)剂邮;
- application.properties:Spring Boot應(yīng)用的配置文件;可以修改一些默認(rèn)設(shè)置横侦;
5.2挥萌、STS使用 Spring Starter Project快速創(chuàng)建項目
二、配置文件
1枉侧、配置文件
SpringBoot使用一個全局的配置文件引瀑,配置文件名是固定的;
- application.properties
- application.yml
配置文件的作用:修改SpringBoot自動配置的默認(rèn)值榨馁;SpringBoot在底層都給我們自動配置好憨栽;
YAML(YAML Ain't Markup Language)
? YAML A Markup Language:是一個標(biāo)記語言
? YAML isn't Markup Language:不是一個標(biāo)記語言;
標(biāo)記語言:
? 以前的配置文件翼虫;大多都使用的是 xxx.xml文件屑柔;
? YAML:以數(shù)據(jù)為中心,比json蛙讥、xml等更適合做配置文件锯蛀;
? YAML:配置例子
server:
port: 8081
? XML:
<server>
<port>8081</port>
</server>
2、YAML語法:
2.1次慢、基本語法
k:(空格)v:表示一對鍵值對(空格必須有)旁涤;
以空格的縮進(jìn)來控制層級關(guān)系;只要是左對齊的一列數(shù)據(jù)迫像,都是同一個層級的
server:
port: 8081
path: /hello
屬性和值也是大小寫敏感劈愚;
2.2、值的寫法
字面量:普通的值(數(shù)字闻妓,字符串菌羽,布爾)
? k: v:字面直接來寫;
? 字符串默認(rèn)不用加上單引號或者雙引號由缆;
? "":雙引號注祖;不會轉(zhuǎn)義字符串里面的特殊字符猾蒂;特殊字符會作為本身想表示的意思
? name: "zhangsan \n lisi":輸出;zhangsan 換行 lisi
? '':單引號是晨;會轉(zhuǎn)義特殊字符肚菠,特殊字符最終只是一個普通的字符串?dāng)?shù)據(jù)
? name: ‘zhangsan \n lisi’:輸出;zhangsan \n lisi
對象罩缴、Map(屬性和值)(鍵值對):
? k: v:在下一行來寫對象的屬性和值的關(guān)系蚊逢;注意縮進(jìn)
? 對象還是k: v的方式
friends:
lastName: zhangsan
age: 20
行內(nèi)寫法:
friends: {lastName: zhangsan, age: 18}
數(shù)組(List、Set):
用 - 值表示數(shù)組中的一個元素
pets:
- cat
- dog
- pig
行內(nèi)寫法
pets: [cat, dog, pig]
3箫章、配置文件值注入
配置文件
person:
lastName: hello
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1, k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 12
javaBean:
- 將配置文件中配置的每一個屬性的值烙荷,映射到這個組件中
- @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關(guān)的配置進(jìn)行綁定;
- prefix = "person":配置文件中哪個下面的所有屬性進(jìn)行一一映射
- 只有這個組件是容器中的組件檬寂,才能容器提供的@ConfigurationProperties功能终抽;
- @Data是一個插件,焰薄,免去了getter/setter和toString這些繁瑣的東西
/**
* @Author: cuzz
* @Date: 2018/9/20 19:34
* @Description:
*/
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}
出現(xiàn)以下提示拿诸,進(jìn)入官網(wǎng),在pom中導(dǎo)入配置
我們可以導(dǎo)入配置文件處理器塞茅,以后編寫配置就有提示了
<!--導(dǎo)入配置文件處理器亩码,配置文件進(jìn)行綁定就會有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
3.1、properties配置文件在idea中默認(rèn)utf-8可能會亂碼
調(diào)整
3.2野瘦、@Value獲取值和@ConfigurationProperties獲取值比較
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的屬性 | 一個個指定 |
松散綁定(松散語法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303數(shù)據(jù)校驗 | 支持 | 不支持 |
復(fù)雜類型封裝 | 支持 | 不支持 |
松散語法綁定:last_name = last-name = lastName 他們?nèi)〉闹刀际窍嗤?/p>
配置文件yml還是properties他們都能獲取到值描沟;
如果說,我們只是在某個業(yè)務(wù)邏輯中需要獲取一下配置文件中的某項值鞭光,使用@Value吏廉;
如果說,我們專門編寫了一個javaBean來和配置文件進(jìn)行映射惰许,我們就直接使用@ConfigurationProperties席覆;
3.3、配置文件注入值數(shù)據(jù)校驗
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
/**
* <bean class="Person">
* <property name="lastName" value="字面量/${key}從環(huán)境變量汹买、配置文件中獲取值/#{SpEL}">
* </property>
* <bean/>
*/
// lastName必須是郵箱格式
// @Email
// @Value("${person.last-name}")
private String lastName;
// @Value("#{11*2}")
private Integer age;
// @Value("true")
private Boolean boss;
private Date birth;
// @Value("${person.maps}")
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}
3.4佩伤、@PropertySource&@ImportResource&@Bean
@PropertySource:加載指定的配置文件;
/**
* 將配置文件中配置的每一個屬性的值晦毙,映射到這個組件中
* @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關(guān)的配置進(jìn)行綁定生巡;
* prefix = "person":配置文件中哪個下面的所有屬性進(jìn)行一一映射
*
* 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能见妒;
* @ConfigurationProperties(prefix = "person")默認(rèn)從全局配置文件中獲取值孤荣;
*
*/
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {
/**
* <bean class="Person">
* <property name="lastName" value="字面量/${key}從環(huán)境變量、配置文件中獲取值/#{SpEL}"></property>
* <bean/>
*/
// lastName必須是郵箱格式
// @Email
// @Value("${person.last-name}")
private String lastName;
// @Value("#{11*2}")
private Integer age;
// @Value("true")
private Boolean boss;
@ImportResource:導(dǎo)入Spring的配置文件,讓配置文件里面的內(nèi)容生效盐股;
Spring Boot里面沒有Spring的配置文件钱豁,我們自己編寫的配置文件,也不能自動識別遂庄;
想讓Spring的配置文件生效寥院,加載進(jìn)來劲赠;@ImportResource標(biāo)注在一個配置類上
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
不來編寫Spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helloService" class="com.cuzz.springboot.service.HelloService"></bean>
</beans>
測試
/**
* @Author: cuzz
* @Date: 2018/9/20 20:41
* @Description:
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestHelloService {
@Autowired
ApplicationContext ioc;
@Test
public void testHelloService() {
boolean b = ioc.containsBean("helloService");
System.out.println(b); // true
}
}
SpringBoot推薦給容器中添加組件的方式涛目;推薦使用全注解的方式
1、配置類@Configuration --> Spring配置文件
2凛澎、使用@Bean給容器中添加組件
/**
* @Configuration:指明當(dāng)前類是一個配置類霹肝;就是來替代之前的Spring配置文件
*
* 在配置文件中用<bean><bean/>標(biāo)簽添加組件
*
*/
@Configuration
public class MyAppConfig {
// 將方法的返回值添加到容器中;容器中這個組件默認(rèn)的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置類@Bean給容器中添加組件了...");
return new HelloService();
}
}
測試:
@Test
public void testHelloService() {
boolean b = ioc.containsBean("helloService");
System.out.println(b); // true
}
輸出:配置類@Bean給容器中添加組件了... 同時返回true
4塑煎、配置文件占位符
4.1沫换、隨機(jī)數(shù)
${random.value}、${random.int}最铁、${random.long}
${random.int(10)}讯赏、${random.int[1024,65536]}
4.2、占位符獲取之前配置的值冷尉,如果沒有可以是用:指定默認(rèn)值
person.last-name=張三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
# 沒有取到:后面是默認(rèn)值
person.dog.name=${person.hello:hello}_dog
person.dog.age=15
5漱挎、Profile
5.1、多Profile文件
我們在主配置文件編寫的時候雀哨,文件名可以是 application-{profile}.properties/yml
默認(rèn)使用application.properties的配置磕谅;
5.2、yml支持多文檔塊方式
server:
port: 8081
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod #指定屬于哪個環(huán)境
5.3雾棺、激活指定profile
? 1膊夹、在配置文件中指定 spring.profiles.active=dev
? 2、命令行:
? java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev捌浩;
? 可以直接在測試的時候放刨,配置傳入命令行參數(shù)
? 3、虛擬機(jī)參數(shù)尸饺;
? -Dspring.profiles.active=dev
6进统、配置文件加載位置
springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認(rèn)配置文件
–file:./config/ 項目目錄下的config
–file:./ 項目目錄下
–classpath:/config/ resources目錄下的config
–classpath:/ resources目錄下
優(yōu)先級由高到底,高優(yōu)先級的配置會覆蓋低優(yōu)先級的配置侵佃;
SpringBoot會從這四個位置全部加載主配置文件陷猫;互補(bǔ)配置;
我們還可以通過spring.config.location來改變默認(rèn)的配置文件位置
項目打包好以后拳缠,我們可以使用命令行參數(shù)的形式率拒,啟動項目的時候來指定配置文件的新位置;指定配置文件和默認(rèn)加載的這些配置文件共同起作用形成互補(bǔ)配置;
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties
7叉抡、外部配置加載順序
SpringBoot也可以從以下位置加載配置尔崔; 優(yōu)先級從高到低;高優(yōu)先級的配置覆蓋低優(yōu)先級的配置褥民,所有的配置會形成互補(bǔ)配置
1.命令行參數(shù)
所有的配置都可以在命令行上進(jìn)行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多個配置用空格分開季春; --配置項=值
2.來自java:comp/env的JNDI屬性
3.Java系統(tǒng)屬性(System.getProperties())
4.操作系統(tǒng)環(huán)境變量
5.RandomValuePropertySource配置的random.*屬性值
由jar包外向jar包內(nèi)進(jìn)行尋找;
優(yōu)先加載帶profile
6.jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
7.jar包內(nèi)部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
再來加載不帶profile
8.jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
9.jar包內(nèi)部的application.properties或application.yml(不帶spring.profile)配置文件
10.@Configuration注解類上的@PropertySource
11.通過SpringApplication.setDefaultProperties指定的默認(rèn)屬性
所有支持的配置加載來源消返;
8载弄、自動配置原理
配置文件到底能寫什么?怎么寫撵颊?自動配置原理宇攻;
三、日志
1倡勇、日志框架
小張逞刷;開發(fā)一個大型系統(tǒng);
? 1妻熊、System.out.println("")夸浅;將關(guān)鍵數(shù)據(jù)打印在控制臺;去掉扔役?寫在一個文件帆喇?
? 2、框架來記錄系統(tǒng)的一些運(yùn)行時信息厅目;日志框架 番枚; zhanglogging.jar;
? 3损敷、高大上的幾個功能葫笼?異步模式?自動歸檔拗馒?xxxx路星? zhanglogging-good.jar?
? 4诱桂、將以前框架卸下來洋丐?換上新的框架,重新修改之前相關(guān)的API挥等;zhanglogging-prefect.jar友绝;
? 5、JDBC---數(shù)據(jù)庫驅(qū)動肝劲;
? 寫了一個統(tǒng)一的接口層迁客;日志門面(日志的一個抽象層)郭宝;logging-abstract.jar;
? 給項目中導(dǎo)入具體的日志實(shí)現(xiàn)就行了掷漱;我們之前的日志框架都是實(shí)現(xiàn)的抽象層粘室;
市面上的日志框架;
JUL卜范、JCL衔统、Jboss-logging、logback海雪、log4j锦爵、log4j2、slf4j....
日志門面 (日志的抽象層) | 日志實(shí)現(xiàn) |
---|---|
|
Log4j JUL(java.util.logging) Log4j2 Logback |
左邊選一個門面(抽象層)喳魏、右邊來選一個實(shí)現(xiàn)棉浸;
日志門面: SLF4J;
日志實(shí)現(xiàn):Logback刺彩;
SpringBoot:底層是Spring框架,Spring框架默認(rèn)是用JCL枝恋;
SpringBoot選用 SLF4j和logback创倔;
2、SLF4j使用
2.1焚碌、如何在系統(tǒng)中使用SLF4j https://www.slf4j.org
以后開發(fā)的時候畦攘,日志記錄方法的調(diào)用,不應(yīng)該來直接調(diào)用日志的實(shí)現(xiàn)類十电,而是調(diào)用日志抽象層里面的方法知押;
給系統(tǒng)里面導(dǎo)入slf4j的jar和 logback的實(shí)現(xiàn)jar
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
圖示;
每一個日志的實(shí)現(xiàn)框架都有自己的配置文件鹃骂。使用slf4j以后台盯,配置文件還是做成日志實(shí)現(xiàn)框架自己本身的配置文件;
2.2畏线、遺留問題
a(slf4j+logback): Spring(commons-logging)静盅、Hibernate(jboss-logging)、MyBatis寝殴、xxxx
統(tǒng)一日志記錄蒿叠,即使是別的框架和我一起統(tǒng)一使用slf4j進(jìn)行輸出?
如何讓系統(tǒng)中所有的日志都統(tǒng)一到slf4j蚣常;
1市咽、將系統(tǒng)中其他日志框架先排除出去;
2抵蚊、用中間包來替換原有的日志框架施绎;
3曼验、我們導(dǎo)入slf4j其他的實(shí)現(xiàn)
3、SpringBoot日志關(guān)系
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
SpringBoot使用它來做日志功能粘姜;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
底層依賴關(guān)系
總結(jié):
? 1)鬓照、SpringBoot底層也是使用slf4j+logback的方式進(jìn)行日志記錄
? 2)、SpringBoot也把其他的日志都替換成了slf4j孤紧;
? 3)豺裆、中間替換包?
@SuppressWarnings("rawtypes")
public abstract class LogFactory {
static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";
static LogFactory logFactory = new SLF4JLogFactory();
? 4)号显、如果我們要引入其他框架臭猜?一定要把這個框架的默認(rèn)日志依賴移除掉?
? Spring框架用的是commons-logging押蚤;
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
SpringBoot能自動適配所有的日志蔑歌,而且底層使用slf4j+logback的方式記錄日志,引入其他框架的時候揽碘,只需要把這個框架依賴的日志框架排除掉即可次屠;
4、日志使用雳刺;
4.1劫灶、默認(rèn)配置
SpringBoot默認(rèn)幫我們配置好了日志;
//記錄器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
//System.out.println();
//日志的級別掖桦;
//由低到高 trace<debug<info<warn<error
//可以調(diào)整輸出的日志級別本昏;日志就只會在這個級別以以后的高級別生效
logger.trace("這是trace日志...");
logger.debug("這是debug日志...");
//SpringBoot默認(rèn)給我們使用的是info級別的,沒有指定級別的就用SpringBoot默認(rèn)規(guī)定的級別枪汪;root級別
logger.info("這是info日志...");
logger.warn("這是warn日志...");
logger.error("這是error日志...");
}
日志輸出格式:
%d表示日期時間涌穆,
%thread表示線程名,
%-5level:級別從左顯示5個字符寬度
%logger{50} 表示logger名字最長50個字符雀久,否則按照句點(diǎn)分割宿稀。
%msg:日志消息,
%n是換行符
-->
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
SpringBoot修改日志的默認(rèn)配置
logging.level.com.cuzz=trace
#logging.path=
# 不指定路徑在當(dāng)前項目下生成springboot.log日志
# 可以指定完整的路徑岸啡;
#logging.file=G:/springboot.log
# 在當(dāng)前磁盤的根路徑下創(chuàng)建spring文件夾和里面的log文件夾原叮;使用 spring.log 作為默認(rèn)文件
logging.path=/spring/log
# 在控制臺輸出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志輸出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
logging.file | logging.path | Example | Description |
---|---|---|---|
(none) | (none) | 只在控制臺輸出 | |
指定文件名 | (none) | my.log | 輸出日志到my.log文件 |
(none) | 指定目錄 | /var/log | 輸出到指定目錄的 spring.log 文件中 |
4.2、指定配置
給類路徑下放上每個日志框架自己的配置文件即可巡蘸;SpringBoot就不使用他默認(rèn)配置的了
Logging System | Customization |
---|---|
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 |
logback.xml:直接就被日志框架識別了奋隶;
logback-spring.xml:日志框架就不直接加載日志的配置項,由SpringBoot解析日志配置悦荒,可以使用SpringBoot的高級Profile功能
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
可以指定某段配置只在某個環(huán)境下生效
</springProfile>
如:
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--
日志輸出格式:
%d表示日期時間唯欣,
%thread表示線程名,
%-5level:級別從左顯示5個字符寬度
%logger{50} 表示logger名字最長50個字符搬味,否則按照句點(diǎn)分割境氢。
%msg:日志消息蟀拷,
%n是換行符
-->
<layout class="ch.qos.logback.classic.PatternLayout">
<springProfile name="dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
</springProfile>
<springProfile name="!dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
</springProfile>
</layout>
</appender>
如果使用logback.xml作為日志配置文件,還要使用profile功能萍聊,會有以下錯誤
no applicable action for [springProfile]
推薦使用spring-logbac.xml
是由Spring Boot識別问芬,可以使用新功能
4.3、切換日志框架
可以按照slf4j的日志適配圖寿桨,進(jìn)行相關(guān)的切換此衅;
slf4j+log4j的方式;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>log4j-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
切換為log4j2
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>