1. 程式人生 > 其它 >SpringBoot當中配置日誌框架詳解(保姆級教程)

SpringBoot當中配置日誌框架詳解(保姆級教程)

技術標籤:SpringBootspringspring bootjava

這篇文章主要講述SpringBoot框架當中配置日誌框架,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。

目錄

先簡單聊聊日誌框架

日誌框架他在專案當中可以幫我們完成工作臺輸出、非同步記錄日誌以及自動歸檔(把日誌輸出到檔案)等功能。在框架的逐步成型當中,日誌框架分為了抽象層和實現層。

所謂的抽象層,也可以稱為統一介面層,在之前,我們都是程式碼當中直接實現介面層來完成日誌處理,但是假如介面層發生變化,那麼改動程度是非常大的,這也可以理解為程式碼的耦合性較高。

為降低程式碼耦合度,拆分成了兩層,現在我們日誌實現直接匯入介面層和日誌實現層相關jar包即可。基本上根本不用寫什麼程式碼即可快速實現日誌處理。

框架選型

市場上存在非常多的日誌框架。JUL(java.util.logging),JCL(Apache Commons Logging),Log4j,Log4j2,Logback、SLF4j、jboss-logging等。Spring Boot在框架內容部使用JCL,spring-boot-starter-logging採用了slf4j+logback的形式,Spring Boot也能自動適配(jul、log4j2、logback) 並簡化配置

這塊的門面指的就是介面層,右邊就是實現類。

左邊選一個門面(抽象層)、右邊來選一個實現;

日誌門面: SLF4J;
日誌實現:Logback;

一般日誌門面(介面層)我們都會用SLF4J,原因:JCL已經長時間未更新了,最後一次更新在2014年,jboss這個一般特定框架會用,所以對於我們來說不適用。

一般實現層都用用Logback,原因:JUL他相對來說沒有其他的好,SLF4J和Log4j還有Logback是同一個人寫的,並且Logback是Log4j的升級版。而Log4j2雖然也很完美,正是太完美,很多框架都沒適配。

Slf4j的簡單使用

在實際開發當中一般我們不會直接去掉實現類,而是去掉介面層的方法。

給系統裡面匯入slf4j的jar和 logback的實現jar,springboot當中spring-boot-starter-web本身就自帶了,不需要導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"); 
	 } 
}

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

SpringBoot當中配置步驟

1、排除其他框架日誌包

一般專案當中我們一旦選擇了一個日誌實現框架之後,就會統一都用這個,在我們很多使用的框架當中都會自帶日誌框架,這個時候就需要排除包了,把他們自帶的日誌包排除掉,避免jar包衝突。

排除掉包不就報錯了嗎?
SLF4j給我們提供了中間包,這些中間包就是一個轉換作用,將他原有的日誌框架替換的基礎上,並且保證框架能夠正常執行。 這些替換包在引入spring-boot-starter-web的時候就已經加入了。這兩個包的作用就是,將使用log4j的還有將使用jul框架的,全都統一使用slf4j,所以我們需要做的就是將那些框架自帶的jar包給排除掉。不讓他引入。
在這裡插入圖片描述
pom示例:

<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient-cache</artifactId>
	<!-- 依從 spring-boot 管理版本 -->
	<version>4.5.2</version>
	<scope>compile</scope>
	<exclusions>
		<exclusion>
			<!-- 使用 jcl-over-slf4j 代替 -->
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>

2、瞭解預設配置

springboot自動裝配當中會為我們配置好一些預設配置,即使我們使用日誌框架,不做任何配置,他也是可以為我們完成一些基礎功能的。

日誌輸出格式:

%d表示日期時間,
%thread表示執行緒名,
%‐5level:級別從左顯示5個字元寬度
%logger{50} 表示logger名字最長50個字元,否則按照句點分割。
%msg:日誌訊息,
%n是換行符

 %d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %5level %logger{50}%msg%n

從這裡可以看出他的預設配置級別是info。

3、通過全域性配置修改預設值

在預設情況下Spring Boot只會在控制檯輸出日誌。
如果不用複雜的功能,只是希望能在檔案中輸出同樣的日誌。
只需要在application.properity加入如下配置:

#日誌儲存目錄
logging.path=D:/log/MyProject
#設定具體包的日誌級別(這裡將與MyBatis相關的mapper包設定為debug級別,效果就是在日誌中輸出sql語句)
logging.level.cn.gzl.Mapper=debug

4、指定配置檔案

給類路徑下放上每個日誌框架自己的配置檔案即可;SpringBoot就不使用他預設配置的了

我們用的是logback,一般用以下兩種

logback.xml:直接就被日誌框架識別了;
logback-spring.xml:日誌框架就不直接載入日誌的配置項,由SpringBoot解析日誌配置,可以使用SpringBoot 的高階Profile功能

<springProfile name="staging"> 
	<!‐‐ configuration to be enabled when the "staging" profile is active ‐‐> 
	可以指定某段配置只在某個環境下生效 
</springProfile>

完整的logback-spring.xml配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
    <include resource="org/springframework/boot/logging/logback/base.xml" />

	<contextName>ph-logback</contextName>
	<property name="log.path" value="c:/logback/logback.log" />

	<!-- 輸出的控制檯 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>INFO</level>
		</filter>
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
			</pattern>
		</encoder>
	</appender>

	<!-- 輸出到檔案 -->
	<appender name="file"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!--日誌名,用到了上面配置的路徑-->
		<file>${log.path}</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
			<!-- 單個檔案最大100M -->			
			<maxFileSize>100MB</maxFileSize>
			<!-- 保留30天的日誌 -->
			<maxHistory>30</maxHistory>
		</rollingPolicy>

		<encoder>
			<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
			</pattern>
		</encoder>
	</appender>
	
	<!-- 開發環境 -->
	<springProfile name="dev">
		<logger name="com.xjgx" level="INFO"/>
	</springProfile>
	
	<!-- 生產環境 -->
	<springProfile name="prod">
		<logger name="com.xjgx" level="ERROR"/>
	</springProfile>

	
	<!-- 日誌級別 -->
	<root level="info">
		<appender-ref ref="console" />
		<appender-ref ref="file" />
	</root>
	
	<!--設定具體包的隔離級別-->
    <logger name="com.xjgx.domain.mapper" level="DEBUG"></logger>
    <logger name="com.xjgx.domain.slave.mapper" level="DEBUG"></logger>

 </configuration>