整理:SpringBoot入門教程(上)

一、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ú)立升級的軟件單元;

詳細(xì)參照微服務(wù)文檔

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撞秋、簡化部署

1537439192685.png

在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)入配置

1537443412214.png

我們可以導(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)整

搜狗截圖20180130161620.png

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)
JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging 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");
  }
}

圖示;

concrete-bindings.png

每一個日志的實(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)行輸出?

legacy.png

如何讓系統(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)系

搜狗截圖20180131220946.png

總結(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();
搜狗截圖20180131221411.png

? 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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亭螟,一起剝皮案震驚了整個濱河市挡鞍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌预烙,老刑警劉巖墨微,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扁掸,居然都是意外死亡翘县,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門也糊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炼蹦,“玉大人,你說我怎么就攤上這事狸剃。” “怎么了狗热?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵钞馁,是天一觀的道長。 經(jīng)常有香客問我匿刮,道長僧凰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任熟丸,我火速辦了婚禮训措,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘光羞。我一直安慰自己绩鸣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布纱兑。 她就那樣靜靜地躺著呀闻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪潜慎。 梳的紋絲不亂的頭發(fā)上捡多,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天蓖康,我揣著相機(jī)與錄音,去河邊找鬼垒手。 笑死蒜焊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的科贬。 我是一名探鬼主播泳梆,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唆迁!你這毒婦竟也來了鸭丛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤唐责,失蹤者是張志新(化名)和其女友劉穎鳞溉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼠哥,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熟菲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了朴恳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抄罕。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖于颖,靈堂內(nèi)的尸體忽然破棺而出呆贿,到底是詐尸還是另有隱情,我是刑警寧澤森渐,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布做入,位于F島的核電站,受9級特大地震影響同衣,放射性物質(zhì)發(fā)生泄漏竟块。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一耐齐、第九天 我趴在偏房一處隱蔽的房頂上張望浪秘。 院中可真熱鬧,春花似錦埠况、人聲如沸耸携。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽违帆。三九已至,卻和暖如春金蜀,著一層夾襖步出監(jiān)牢的瞬間刷后,已是汗流浹背的畴。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尝胆,地道東北人丧裁。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像含衔,于是被迫代替她去往敵國和親煎娇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容