線性迴歸

##### A.日誌框架
###### 1. 引入
* 我在開發階段通過 System.out.print("") 進行測試,上線之後把日誌輸出到一個日誌裏記錄運行情況
* 我們可以自定義一個框架,用於記錄運行時的一些信息
    * 改進:將日誌進行過濾功能,異步模式,自動歸檔.....
    * 改進:新框架出來了,要改代碼替換之前的框架
        * ==面向接口編程==
        * 日誌抽象層
        * ==向項目中導入不同的日誌實現==

###### 2. 市面上的日誌框架
* JUL, JCL, Jboss-logging, logback, log4j, log4j2, slf4j....

| 日誌門面(日誌的抽象層) | 日誌實現|
| --------------------- | ---------------- |
| ~~JCL(Jakarta  Commons Logging)~~    SLF4j(Simple  Logging Facade for Java)    **~~jboss-logging~~** | Log4j  JUL(java.util.logging)  Log4j2  **Logback** |

* 左邊選一個接口(抽象層),右邊選一個實現
    * 左邊(抽象): SLF4J
    * 右邊(實現): Logback(Log4j的升級版)
* SpringBoot 底層是 Spring 框架,默認使用的是 JCL
    * 但是 SpringBoot 選用了 SLF4J--> Logback

###### 3. slf4j 使用原理
* 以後開發的時候,日誌記錄方法的調用應該調用抽象層,而不是調用實現類
    * 只要調用抽象層的方法,框架自動使用實現類來輸出日誌
1. 給系統裏導入 slf4j 的依賴
2. 導入 logback 的實現依賴
3. 使用日誌記錄

```
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");
  }
}
```

* 每一個日誌的實現框架都有自己的配置文件。使用slf4j以後,配置文件還是做成日誌實現框架自己本身的配置文件

###### 4. 遺留問題
* 如果我們開發的系統使用 slf4j + logback 作爲日誌框架
    * 但是我們使用了別的框架如: Spring, MyBatis, Hibernate 等開源框架
    * 但是這些框架不是使用 slf4j + logback 作爲日誌框架的
* 這樣就導致我們的工程使用了多個日誌記錄框架
    * 我們需要統一日誌記錄的方式
    * 統一使用 slf4j 進行配置
* 偷天換日方式
    * 引入適配包,把其他類型的日誌實現依賴排除掉,然後加入自己對其他日誌類的實現
    * 但是這個實現會把日誌輸出到我們的 slf4j 中,這樣就偷偷的把進行了轉換
* ==如何讓系統中所有的日誌都統一到slf4j==
    1. 將系統中其他日誌框架先排除出去
    2. 用中間包來替換原有的日誌框架
    3. 我們導入slf4j其他的實現

##### B. SpringBoot日誌關係
* 每一個啓動器裏面都有 spring-boot-starter 這個依賴

```
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
```

* spring-boot-starter 裏面就有日誌啓動器: spring-boot-starter-logging

```
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>
```

* 總結
    1. SpringBoot底層也是使用slf4j+logback的方式進行日誌記錄
    2. SpringBoot也把其他的日誌都替換成了slf4j
* ==SpringBoot能自動適配所有的日誌,而且底層使用slf4j+logback的方式記錄日誌==
    * ==引入其他框架的時候,只需要把這個框架依賴的日誌框架排除掉即可==
    * ==不然其他框架的日誌不能做適配==

##### C. 日誌使用
1. 默認配置
    * SpringBoot 默認幫我們配置好了日誌

```
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
        "日誌的級別;""
        "由低到高   trace<debug<info<warn<error"
        "可以調整輸出的日誌級別;日誌就只會在這個級別以以後的高級別生效"
        logger.trace("這是trace日誌...");
        logger.debug("這是debug日誌...");
        
        "SpringBoot默認給我們使用的是info級別的,沒有指定級別的就用SpringBoot默認規定的級別;root級別"
        logger.info("這是info日誌...");
        logger.warn("這是warn日誌...");
        logger.error("這是error日誌...");
}
```

* SpringBoot修改日誌的默認配置
    * logging.file 和 logging.path 是一對衝突設置
    * 指定了 logging.file 就不需要指定 logging.path
        * 一般指定 logging.path

```
# 設置日誌級別,要指定包
logging.level.com.study=trace

# 不指定路徑在當前項目下生成springboot.log日誌
# 可以指定完整的路徑;
# logging.file=G:/springboot.log

# 在當前磁盤的根路徑下創建spring文件夾和裏面的log文件夾;使用 spring.log 作爲默認文件
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
```

```
<!--
日誌輸出格式:
    %d表示日期時間,
    %thread表示線程名,
    %-5level:級別從左顯示5個字符寬度
    %logger{50} 表示logger名字最長50個字符,否則按照句點分割。 
    %msg:日誌消息,
    %n是換行符
-->
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
```

| logging.file | logging.path | Example  | Description                        |
| ------------ | ------------ | -------- | ---------------------------------- |
| (none)       | (none)       |          | 只在控制檯輸出                     |
| 指定文件名   | (none)       | my.log   | 輸出日誌到my.log文件               |
| (none)       | 指定目錄     | /var/log | 輸出到指定目錄的 spring.log 文件中 |


##### E. 指定配置
* 給類路徑下放上每個日誌框架自己的配置文件即可;SpringBoot就不使用他默認配置的了

| 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功能
* logback-spring.xml

```
<springProfile name="staging">
          "可以指定某段配置只在某個環境下生效"
</springProfile>
```

```
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <!--
    日誌輸出格式:
                %d表示日期時間,
                %thread表示線程名,
                %-5level:級別從左顯示5個字符寬度
                %logger{50} 表示logger名字最長50個字符,否則按照句點分割。 
                %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]
```
##### F. 切換日誌框架
* SpringBoot 默認使用的是 SLF4J + Logback 框架
* 如果我們想切換日誌框架
    * 可以按照slf4j的日誌適配圖,進行相關的切換
* 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>
```
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章