Java日誌框架的使用(slf4j、 )

引言

SpringBoot為Logback提供了預設的配置檔案base。xml,base。xml檔案裡定義了預設的日記輸出級別為INFO。

ERROR(40, “ERROR”), WARN(30, “WARN”), INFO(20, “INFO”), DEBUG(10, “DEBUG”), TRACE(0, “TRACE”);

I Logback的使用

Java日誌框架的使用(slf4j、 )

Slf4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,它只服務於各種各樣的日誌系統。 Slf4J是一個用於日誌系統的簡單Facade,允許終端使用者在部署其應用時使用其所希望的日誌系統。

SLF4J更像是將這些日誌框架重新封裝,提供了共通的介面供使用者呼叫,無論底層框架如何改變,只需要替換依賴即可,不需要再逐一更改排查專案何處呼叫了原日誌系統的方法。

Logback是SpringBoot內建的日誌處理框架,你會發現spring-boot-starter其中包含了spring-boot-starter-logging,該依賴內容就是 Spring Boot 預設的日誌框架 logback。官方文件:logback。qos。ch/manual/

1。1 門面模式

slf4j是門面模式的典型應用,門面模式,其核心為外部與一個子系統的通訊必須透過一個統一的外觀物件進行,使得子系統更易於使用。

Java日誌框架的使用(slf4j、 )

slf4j的用法就是常年不變的一句“Logger logger = LoggerFactory。getLogger(Object。class);”,可見這裡就是透過LoggerFactory去拿slf4j提供的一個Logger介面的具體實現而已。

我們可以使用mvn 引入lombok,使用註解來更簡便的使用slf4j。

POJO的getter/setter/toString;異常處理;I/O流的關閉操作等等,這些樣板程式碼既沒有技術含量,又影響著程式碼的美觀,Lombok應運而生。

IDEA 2020最後一個版本釋出了,已經內建了Lombok外掛,SpringBoot 2。1。x之後的版本也在Starter中內建了Lombok依賴

1。2 slf4j的應用舉例

package com。example。demo;import org。junit。jupiter。api。Test;import org。slf4j。Logger;import org。slf4j。LoggerFactory;import org。springframework。boot。test。context。SpringBootTest;//1、新版spring-boot-starter-test不再整合junit,而是junit-jupiter,不再使用@RunWith()註解。//@RunWIth(SpringRunner。class)@SpringBootTestpublic class LoggerTest {private final Logger logger = LoggerFactory。getLogger(LoggerTest。class);@Test public void test1() { logger。debug(“debug。。。”); logger。info(“info。。。”); //系統的預設日記級別 logger。error(“error。。。”);}}

1。3 application。properties

配置檔案所在目錄不同優先順序也不同,如下圖1~4優先順序從高到低

Java日誌框架的使用(slf4j、 )

當前專案根目錄的config下 當前專案根目錄下 resource目錄的config目錄下 resource目錄下 在使用 spring。config。location 指定外部配置檔案時,需要此份配置檔案需全量滿足當前工程執行時所需,因為它不會去與 resources 目錄下的配置檔案去做 merge 操作。

application。properties和application。yml作用是一致的,spring boot專案中同時存在application。properties和application。yml檔案時,兩個檔案都有效,但是application。properties的優先順序會比application。yml高。

要麼用application。properties 要麼用 application。yml,不要都用使自己混亂

yaml不同於 properties 檔案的無序,yaml 配置有序。

可設定spring。config。name環境變數指定配置檔名稱。

1。4 啟用“除錯”模式

方式一: 在application。properties中配置debug=true,該屬性置為true的時候,核心Logger(包含嵌入式容器、hibernate、spring)會輸出更多內容,但是你自己應用的日誌並不會輸出為DEBUG級別。

方式二:在編譯設定中開啟

Java日誌框架的使用(slf4j、 )

預設情況下,Spring Boot將日誌輸出到控制檯,不會寫到日誌檔案。我們可以在application。properties或application。yml配置,但是隻能配置簡單的場景,儲存路徑、日誌格式等,複雜的場景(區分 info 和 error 的日誌、每天產生一個日誌檔案等)滿足不了,只能自定義配置。

1。5 自定義logback的配置檔案

按如下規則組織配置檔名,就能被正確載入: Logback:logback-spring。xml, logback-spring。groovy, logback。xml, logback。groovy

Log4j:log4j-spring。properties, log4j-spring。xml, log4j。properties, log4j。xml

Log4j2:log4j2-spring。xml, log4j2。xml

JDK (Java Util Logging):logging。properties

<?xml version=“1。0” encoding=“utf-8” ?> <!—— 控制檯日誌:輸出全部日誌到控制檯 ——> <!—— 控制輸出流物件,預設System。out 改為System。err——> System。err <!—— 日誌訊息格式配置——> ${ENCODER_PATTERN} <!—— root Logger 配置——>

fileInfoLog和fileErrorLog

ERROR DENY ACCEPT %msg%n <!——滾動策略——> <!——路徑——> /Users/mac/Desktop/log/tomcat/test/info。%d。log ERROR %msg%n <!——滾動策略——> <!——路徑——> /Users/mac/Desktop/log/tomcat/test/error。%d。log <!—— root Logger 配置——>

查閱正在改變的日誌檔案: tail -f error。2022-04-09。log

II SpringBoot內建外掛的使用(jackson和lombok)

idea2021。2。2 已經捆綁安裝jackson和lombok外掛

2。1 lombok

Lombok能透過註解的方式,在編譯時自動為屬性生成構造器、getter/setter、equals、hashcode、toString方法。

projectlombok。org/features/al…

新增maven,如果不指定版本號,會提示找不到最新版本1。18。22,我們可以指定版本之後,再重新載入。

org。projectlombok lombok 1。18。22

如果不想每次都寫private final Logger logger = LoggerFactory。getLogger(當前類名。class); 可以用註解@Slf4j

@Slf4j public void test1() { log。debug(“debug。。。”); log。info(“info。。。”); //系統的預設日記級別 log。error(“error。。。”);}

註解@Data作用在類上,會為類的所有屬性自動生成setter/getter、equals、hasCode、toString方法。

@Builder在建立物件時具有鏈式賦值的特點。

import lombok。AllArgsConstructor;import lombok。Builder;import lombok。Data;import lombok。NoArgsConstructor;@Data@NoArgsConstructor@AllArgsConstructor@Builderpublic class Student {

2。2 jackson

SpringBoot內建了jackson來實現JSON的序列化和反序列化。

jackson使用ObjectMapper類將POJO物件序列化為JSON字串,也能將JSON字串反序列化為POJO物件。

import com。fasterxml。jackson。core。JsonProcessingException;import com。fasterxml。jackson。databind。ObjectMapper; String str = mapper。writeValueAsString(stu); Student stu = mapper。readValue(str,Student。class);

jackson包含很多註解,用於個性化序列化和反序列化操作。

@JsonProperty(alias),作用在屬性上,為屬性指定別名。

@JsonIgnore,作用在屬性上,用此註解來忽略屬性。

@JsonIgnoreProperties({propertyName1,propertyName2}),作用在類上,表示忽略一組屬性。

@JsonFormat(pattern=“”),用於格式化日期。

比如@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”),將時間格式化為“年-月-日 時:分:秒”。

@JsonIgnore private String gender; @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”) @JsonProperty(“bd”) private Date birthday;

Java日誌框架的使用(slf4j、 )

作者:公眾號iOS逆向

連結:https://juejin。cn/post/7085531183148187684