線性迴歸
##### 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>
```
###### 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>
```
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.