當我們在進行web開發時,經常會用到各種各樣的框架,常見的有spring、mybatis、hibernate等等,每個框架底層都有著自己的紀錄檔實現,那麼難道我們在進行開發時,還需要在使用不同框架的時候使用其對應的API嘛?這將會大大增加我們的開發成本。還有如果我們在後期對專案進行二次開發時,如果要換紀錄檔框架,難道還得需要把原本的紀錄檔API全部替換掉嗎?
此時我們在想,如果每個紀錄檔框架能像我們平時開發時面向介面開發多好,所有的紀錄檔框架都統一API,但是實現可以各不相同,這樣就能解決上面所說到的問題了。而這種思想模式,我們可以稱之為門面模式。顧名思義,就是我們面向開發者的API是相同的,但是實現層還是由每個框架來決定的。
所以,SpringBoot幫我們已經做好了。它的紀錄檔門面選用的就是 SLF4J,而紀錄檔實現選用的是Logback。
從 SLF4J官網上,我們可以看到詳細範例,例如:
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");
}
}
從上圖中,我們可以看到,如果log4j和JUL想使用SLF4J作為紀錄檔門面,還需要一層適配層。例如,如果要使用 SLF4J 作為 log4j 的門面,就必須引入 slf4j-api.jar 和 slf-4j-log412.jar 的依賴。其中 slf-4j-log412.jar 就是用來做適配的,我們在呼叫slf4j API 的時候其實是在呼叫 slf-4j-log412.jar 中的API,而 slf-4j-log412.jar 中的API執行的又是 log4j中的具體方法。
SpringBoot的知識點很多,不只是紀錄檔方面的,還有很多方面需要學習的,我這還有很多的學習資料和教學視訊,都是Java後端方面的,有需要學習的小夥伴都可以點選進入,暗號:css,還有學習路線圖,有需要學習的小夥伴都可以進群,大家一起學習交流!
由於篇幅有限,只能展示其中的一點學習教學,有需要的可以點選進入,暗號:css,可以免費提供的。
(一)SpringBoot整合其他框架紀錄檔門面
我們知道,SpringBoot紀錄檔是使用SLF4J作為紀錄檔門面,但是其他框架肯定也有自己的紀錄檔門面,例如 Java Commons Logging ,Jboss Logging 等等,那麼如果我想整個專案都使用SLF4j作為紀錄檔門面怎麼辦呢?
不用擔心,SpringBoot已經幫我們做了一波偷樑換柱的操作。在沒看SpringBoot如何實現之前,我們來看下面這張圖:
通常,我們依賴的某些元件依賴於SLF4J以外的紀錄檔記錄API。為了解決這種情況,SLF4J附帶了幾個橋接模組,這些模組將對log4j,JCL和java.util.logging API的呼叫重定向,就好像它們是對SLF4J API一樣。
所以,我們可以總結一下如何讓系統中所有的紀錄檔都統一到SLF4J:
當我們在構建SpringBoot專案時,引入了一層依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.1.RELEASE</version>
<scope>compile</scope>
</dependency>
這裡面就會有一個紀錄檔啟動器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.1.1.RELEASE</version>
<scope>compile</scope>
</dependency>
底層依賴關係:
可以看到,springboot底層預設是使用SLF4J+Logback 的方式記錄紀錄檔,並且把其他的紀錄檔框架也替換成了SLF4J。當我們引入其他框架的時候,只需要把這個框架的預設紀錄檔依賴移除掉即可,SpringBoot能自動適配所有的紀錄檔。
(二)SpringBoot 框架中紀錄檔的使用
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紀錄檔...");
}
我們也可以在組態檔中修改紀錄檔的預設設定:
logging:
# 對指定的包調整紀錄檔的級別(trace、debug、info、warn、error)
level:
com:
van: warn
# 如果不指定路徑,則在當前專案下生成springboot.log檔案
# 如果指定路徑,則在指定路徑下生成springboot.log檔案
file: springboot.log
# 在當前磁碟的根路徑下建立spring資料夾和裡面的log資料夾;使用 spring.log 作為預設檔案
path: /spring/log
pattern:
# 在控制檯指定格式輸出紀錄檔
console:
# 在檔案中指定格式輸出
file:
2、指定設定
在專案類路徑下放上每個紀錄檔框架的組態檔,SpringBoot就不會使用自己的預設設定了。下面的這個表格就是對應紀錄檔框架在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-spring.xml):
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定義紀錄檔檔案的儲存地址 勿在 LogBack 的設定中使用相對路徑-->
<property name="LOG_HOME" value="/logs/log" />
<!-- 控制檯輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:紀錄檔訊息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成紀錄檔檔案 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--紀錄檔檔案輸出的檔名-->
<FileNamePattern>${LOG_HOME}/swh.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是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--紀錄檔檔案最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!--myibatis log configure -->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- mybatis列印sql語句 -->
<logger name="com.van.springboot.dao" level="DEBUG"></logger>
<!-- 紀錄檔輸出級別 -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
SpringBoot的知識點很多,想要學透,想要學懂,那就必須要花費精力和時間,特別是自學的小夥伴,有時候找對資料和方式很重要。我這整理有很多的Java方面的學習資料,也有針對Java面試的面試資料,只要是有需要的,就可以點選進入,暗號:css,都可以免費提供!