1. 程式人生 > >SpringBoot學習_日誌

SpringBoot學習_日誌

文章目錄

日誌框架分類和選擇

日誌門面與日誌實現的關係有點像、JDBC和資料庫驅動的關係

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

SpringBoot選用 SLF4jlogback
SpringBoot使用它來做日誌功能

	<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
      <version>2.0.5.RELEASE</version
>
<scope>compile</scope> </dependency>

SLF4j使用

開發的時候日誌記錄方法的呼叫,不應該來直接呼叫日誌的實現類,而是呼叫日誌抽象層裡面的方法
SLF4J使用者手冊
首先給系統裡面匯入slf4j的jar和 logback的實現jar
Hello World:

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以後,配置檔案還是做成日誌實現框架自己本身的配置檔案

統一日誌記錄

在實際開發中情況會更復雜一些
例子:
在開發a系統的時候用的是(slf4j+logback),系統中需要用到Spring(commons-logging),hibernate((jboss-logging),mybatis等等,這些框架底層中又自帶了日誌記錄,現在想統一使用slf4j日誌
圖示
在這裡插入圖片描述

如何讓系統中所有的日誌都統一到slf4j:

  1. 將系統中其他日誌框架先排除出去
  2. 用中間包來替換原有的日誌框架
  3. 我們匯入slf4j其他的實現

這些SpringBoot都已經幫我們最好了
pom.xml中右鍵
在這裡插入圖片描述
會跳轉到一個流程圖,從中我們可以看到
在這裡插入圖片描述

總結:

  1. SpringBoot底層也是使用slf4j+logback的方式進行日誌記錄
  2. SpringBoot也把其他的日誌都替換成了slf4j
  3. 中間替換包

如果我們要引入其他框架?一定要把這個框架的預設日誌依賴移除掉
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的方式記錄日誌,引入其他框架的時候,只需要把這個框架依賴的日誌框架排除掉即可
我所使用的的springboot版本是2.0.5.RELEASE,裡面的spring版本是5.0.9.RELEASE,沒有commons‐logging,所以不用排除

	<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.0.9.RELEASE</version>
      <scope>compile</scope>
    </dependency>

日誌使用

預設配置

SpringBoot預設幫我們配置好了日誌
我們可以在測試類中看一下

	//記錄器
    Logger logger = LoggerFactory.getLogger(getClass());
    @Test
    public void contextLoads() {
        //System.out.println();
        //日誌的級別;
        //由低到高 trace<debug<info<warn<error
        //可以調整輸出的日誌級別;日誌就只會在這個級別以後的高級別生效
        logger.trace("這是trace日誌...");//框架執行中如果你想跟蹤資訊時用
        logger.debug("這是debug日誌...");//除錯資訊
        //SpringBoot預設給我們使用的是info級別的,沒有指定級別的就用SpringBoot預設規定的級別;root級別
        logger.info("這是info日誌...");//自己定義的想要輸出的資訊
        logger.warn("這是warn日誌...");//警告
        logger.error("這是error日誌...");//錯誤
    }

修改日誌的級別:

#表示把com.nyh裡面的所有的類的日誌都調為`trace`級別
logging.level.com.nyh=trace

執行結果:
在這裡插入圖片描述

日誌的格式

日誌輸出格式:
%d表示日期時間,
%thread表示執行緒名,
%‐5level:級別從左顯示5個字元寬度
%logger{50} 表示logger名字最長50個字元,否則按照句點分割。
%msg:日誌訊息,
%n是換行符
輸出:
%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n
在properties或yml配置檔案中配置

# 在控制檯輸出的日誌的格式
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 檔案中

這種方法只能修改一些預設配置,想要知道更多的預設配置可以到Maven: org.springframework.boot:spring-boot:2.0.5.RELEASE2jar包下的logging下檢視配置檔案
例如logback的日誌配置檔案:
在這裡插入圖片描述

自定義日誌配置

如果我們想要用springboot的日誌高階功能,比如非同步日誌,自動歸檔等,我們需要自己寫配置檔案
在官方文件中有專門的介紹
在這裡插入圖片描述
給類路徑(resources資料夾)下放上每個日誌框架自己的配置檔案即可;SpringBoot就不使用他預設配置的了
名字有兩種:
logback.xml:會直接就被日誌框架識別,相當於繞過了springboot;
logback-spring.xml:日誌框架就不直接載入日誌的配置項,由SpringBoot解析日誌配置,可以使用SpringBoot的高階Profile功能
logback-spring.xml這種寫法的好處是可以使用springProfile標籤

<springProfile name="dev">
<!‐‐ configuration to be enabled when the "staging" profile is active 
指定這段配置只在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>

切換日誌框架

按照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>