Lombok @Slf4j log對(duì)象沒(méi)有info等方法不可用問(wèn)題及解決
1. Lombook插件沒(méi)安裝(幾率很?。?/h2>
這個(gè)一般是對(duì)于低版本Idea可能會(huì)出現(xiàn),可能是idea沒(méi)有安裝lombook插件導(dǎo)致的,去plugin里面安裝下Lombok插件就可以了,但是幾率很小.
高版本idea可以直接排除。
2. SpringBoot的項(xiàng)目依賴沖突
排除 原因一 后可能是由于日志實(shí)現(xiàn)在springboot的starter中已經(jīng)有了,但是又導(dǎo)入了logback-classic,排除沖突問(wèn)題。
3. 普通項(xiàng)目
非SpringBoot項(xiàng)目中,用到Lombook,但是只導(dǎo)入了Lombook的依賴,只是導(dǎo)入了日志的門面。
3.1 分析原因
下圖為無(wú)info等方法截圖:
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.28</version> </dependency> </dependencies>
可以看到,我只導(dǎo)入了lombok的依賴。所以沒(méi)有info等方法,所以我們還需要導(dǎo)入日志的實(shí)現(xiàn)。也就是logback-classic
。(版本號(hào)根據(jù)實(shí)際而定)
3.2 導(dǎo)入所需依賴
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.28</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> </dependencies>
下圖為導(dǎo)入日志實(shí)現(xiàn)的依賴的截圖:
3.3 測(cè)試效果
我們新建一個(gè)測(cè)試類,在類上導(dǎo)入@Slf4j
注解,打印日志 “Hello World!”,下面是示例代碼:
import lombok.extern.slf4j.Slf4j; @Slf4j public class TestMain { public static void main(String[] args) { log.info("Hello World!"); } }
執(zhí)行上述代碼,你將得到如下輸出:
16:17:32.896 [main] INFO cn.cstor.Main - Hello World!
4. @Slf4j注解介紹
@Slf4j
是 Lombok(一種Java庫(kù))提供的一個(gè)注解,它簡(jiǎn)化了在 Java 類中添加日志記錄的過(guò)程。@Slf4j
注解會(huì)自動(dòng)生成一個(gè)名為 log
的 Logger
對(duì)象,使得在類中使用日志功能更加便捷。
具體來(lái)說(shuō),@Slf4j
注解在類上使用時(shí),Lombok會(huì)在編譯時(shí)自動(dòng)為該類生成以下代碼:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Slf4j public class MyClass { // 自動(dòng)生成的 Logger 對(duì)象 private static final Logger log = LoggerFactory.getLogger(MyClass.class); // 類的其他代碼... }
使用 @Slf4j
注解后,你可以直接在類中使用 log
對(duì)象進(jìn)行日志記錄,而無(wú)需手動(dòng)創(chuàng)建 Logger 對(duì)象。
例如:
@Slf4j public class MyClass { public void myMethod() { log.info("This is an info message"); log.error("This is an error message"); } }
上述代碼中,@Slf4j
注解自動(dòng)創(chuàng)建了名為 log
的靜態(tài) Logger
對(duì)象,你可以使用它調(diào)用日志級(jí)別的方法,如 info
、error
等。
這樣的自動(dòng)生成減少了樣板代碼,使得日志的添加和管理更加簡(jiǎn)單。
5. SLF4J介紹
Simple Logging Facade for Java (SLF4J) 用作各種日志框架(例如 java.util.logging、log4j 1.x、reload4j 和 logback)的簡(jiǎn)單外觀或抽象。SLF4J 允許最終用戶在部署時(shí)插入所需的日志記錄框架 。請(qǐng)注意,啟用 SLF4J 的庫(kù)/應(yīng)用程序意味著僅添加一個(gè)強(qiáng)制依賴項(xiàng),即 slf4j-api-2.0.9.jar。
5.1 Maven導(dǎo)入
考慮到 Maven 的傳遞依賴規(guī)則,對(duì)于“常規(guī)”項(xiàng)目(不是庫(kù)或框架),可以通過(guò)單個(gè)依賴項(xiàng)聲明來(lái)完成聲明日志記錄依賴項(xiàng)。
5.1.1 SLF4J API
SLF4J API 包含在“org.slf4j:slf4j-api”工件中。您可以在pom.xml文件中顯式聲明對(duì)其的依賴關(guān)系,如下所示。請(qǐng)注意,大多數(shù)日志記錄實(shí)現(xiàn)都會(huì)自動(dòng)引入 slf4j-api 作為依賴項(xiàng)。然而,聲明對(duì) slf4j-api 的顯式依賴關(guān)系通常是一個(gè)好主意,以便借助 Maven 的“最近定義”依賴關(guān)系中介規(guī)則修復(fù)項(xiàng)目中 slf4j-api 的正確版本。
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>2.0.9</version> </dependency>
5.1.2 LOGBACK-CLASSIC 1.3.X (JAVAX EE)
如果您希望使用Javax EE的 logback-classic作為底層日志記錄框架,您需要做的就是將“ch.qos.logback:logback-classic”聲明為依賴項(xiàng)你的 pom.xml文件如下所示。除了 logback-classic-1.3.6.jar之外,這還會(huì)將slf4j-api-2.0.9.jar以及l(fā)ogback-core-1.3.6.jar引入您的項(xiàng)目中。
請(qǐng)注意,顯式聲明對(duì)logback-core-1.3.6或 slf4j-api-2.0.9.jar的依賴關(guān)系 并沒(méi)有錯(cuò),并且可能需要借助 Maven 的“最近定義”依賴關(guān)系中介規(guī)則來(lái)強(qiáng)制使用所述工件的正確版本。
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.3.6</version> </dependency>
5.1.3 LOGBACK-CLASSIC 1.4.X (JAKARTA EE)
如果您希望使用Jakarta EE的 logback-classic作為底層日志框架,您需要做的就是將“ch.qos.logback:logback-classic”聲明為依賴項(xiàng)你的 pom.xml文件如下所示。除了 logback-classic-1.4.6.jar之外,這還會(huì)將slf4j-api-2.0.9.jar以及l(fā)ogback-core-1.4.6.jar 引入您的項(xiàng)目中。
請(qǐng)注意,顯式聲明對(duì)logback-core-1.4.6 或slf4j-api-2.0.9.jar的依賴關(guān)系并沒(méi)有錯(cuò),并且可能需要借助 Maven 的“最近定義”依賴關(guān)系中介規(guī)則來(lái)強(qiáng)制使用所述工件的正確版本。
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.4.6</version> </dependency>
5.1.4 RELOAD4J
如果您希望使用 reload4j 作為底層日志框架,您所需要做的就是在 pom.xml 文件中聲明“org.slf4j:slf4j-reload4j”作為依賴項(xiàng), 如下所示。除了 slf4j-reload4j-2.0.9.jar之外,這還會(huì)將slf4j-api-2.0.9.jar以及reload4j-1.2.25.jar引入您的項(xiàng)目中。
請(qǐng)注意,顯式聲明對(duì)reload4j-1.2.25.jar或 slf4j-api-2.0.9.jar 的依賴關(guān)系 并沒(méi)有錯(cuò),并且可能需要借助 Maven 的“最近定義”依賴關(guān)系中介規(guī)則來(lái)強(qiáng)制使用所述工件的正確版本。
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-reload4j</artifactId> <version>2.0.9</version> </dependency>
5.1.5 LOG4J 1.2.X
從 SLF4J 版本 1.7.36 開始,聲明依賴于 Maven 指令的 org.slf4j:slf4j-log4j12重定向 org.slf4j:slf4j-reload4j。
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>2.0.9</version> </dependency>
5.1.6 JAVA.UTIL.LOGGING
如果您希望使用 java.util.logging 作為底層日志框架,您需要做的就是在 pom.xml 文件中聲明“org.slf4j:slf4j-jdk14”作為依賴項(xiàng),如下 所示。除了 slf4j-jdk14-2.0.9.jar之外,這還會(huì)將slf4j-api-2.0.9.jar引入您的項(xiàng)目中。
請(qǐng)注意,顯式聲明對(duì)slf4j-api-2.0.9.jar的依賴關(guān)系 并沒(méi)有錯(cuò),并且可能需要借助 Maven 的“最近定義”依賴關(guān)系中介規(guī)則來(lái)強(qiáng)制使用所述工件的正確版本。
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jdk14</artifactId> <version>2.0.9</version> </dependency>
5.1.7 SLF4J SIMPLE
如果您希望使用 org.slf4j.simple 作為底層日志記錄實(shí)現(xiàn),您所需要做的就是在 pom.xml 文件中聲明“org.slf4j:slf4j-simple”作為依賴項(xiàng),如下所示 。除了 slf4j-simple-2.0.9.jar之外,這還會(huì)將slf4j-api-2.0.9.jar引入您的項(xiàng)目中。
請(qǐng)注意,顯式聲明對(duì)slf4j-api-2.0.9.jar的依賴關(guān)系 并沒(méi)有錯(cuò),并且可能需要借助 Maven 的“最近定義”依賴關(guān)系中介規(guī)則來(lái)強(qiáng)制使用所述工件的正確版本。
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>2.0.9</version> </dependency>
5.2 HelloWorld
按照編程傳統(tǒng)的慣例,下面的示例說(shuō)明了使用 SLF4J 輸出“Hello world”的最簡(jiǎn)單方法。
首先獲取名為“HelloWorld”的記錄器。該記錄器又用于記錄消息“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"); } }
要運(yùn)行此示例,您首先需要獲取 slf4j工件。完成后,將文件 slf4j-api-2.0.9.jar添加到類路徑中。
編譯并運(yùn)行HelloWorld將在控制臺(tái)上打印以下輸出:
SLF4J:未找到 SLF4J 提供程序。
SLF4J:默認(rèn)為無(wú)操作 (NOP) 記錄器實(shí)現(xiàn)
SLF4J:請(qǐng)參閱 https://www.slf4j.org/codes.html#noProviders 了解更多詳細(xì)信息。
如果您使用的是 SLF4J 1.7 或更早版本,則消息將為:
SLF4J:無(wú)法加載類“org.slf4j.impl.StaticLoggerBinder”。
SLF4J:默認(rèn)為無(wú)操作 (NOP) 記錄器實(shí)現(xiàn)
SLF4J:請(qǐng)參閱 https://www.slf4j.org/codes.html#StaticLoggerBinder 了解更多詳細(xì)信息。
打印此警告是因?yàn)樵陬惵窂缴险也坏?slf4j 提供程序(或綁定)。
一旦您將提供程序添加到類路徑中,該警告就會(huì)消失。假設(shè)您添加 slf4j-simple-2.0.9.jar以便您的類路徑包含:
- slf4j-api-2.0.9.jar
- slf4j-simple-2.0.9.jar
編譯并運(yùn)行HelloWorld現(xiàn)在將在控制臺(tái)上產(chǎn)生以下輸出:
0 [主要] INFO HelloWorld - 你好世界
5.3 典型使用模式
下面的示例代碼說(shuō)明了 SLF4J 的典型使用模式。請(qǐng)注意第 15 行中 {} 占位符的使用。
1: import org.slf4j.Logger;
2: import org.slf4j.LoggerFactory;
3:
4: public class Wombat {
5:
6: final Logger logger = LoggerFactory.getLogger(Wombat.class);
7: Integer t;
8: Integer oldT;
9:
10: public void setTemperature(Integer temperature) {
11:
12: oldT = t;
13: t = temperature;
14:
15: logger.debug("Temperature set to {}. Old value was {}.", t, oldT);
16:
17: if(temperature.intValue() > 50) {
18: logger.info("Temperature has risen above 50 degrees.");
19: }
20: }
21: }
5.4 流暢的日志記錄 API
- SINCE 2.0.0 SLF4J API version 2.0.0 requires Java 8 and introduces a backward-compatible fluent logging API. By backward-compatible, we mean that existing logging frameworks do not have to be changed in order for the user to benefit from the fluent logging API.
- The idea is to build a logging event piece by piece with a LoggingEventBuilder and to log once the event is fully built. The atTrace(), atDebug(), atInfo(), atWarn() and atError() methods, all new in the org.slf4j.Logger interface, return an instance of LoggingEventBuilder. For disabled log levels, the returned LoggingEventBuilder instance does nothing, thus preserving the nanosecond level performance of the traditional logging interface.
- When using the fluent API, you must terminate the invocation chain by calling one of the log() method variants. Forgetting to call any of the log() method variants will result in no logging regardless of the logging level. Fortunately, if this happens, some IDEs will alert you with a compiler warning.
以下是一些使用示例:
- The statement
logger.atInfo().log("Hello world.");
- is equivalent to:
logger.info("Hello world.");
以下日志語(yǔ)句在其輸出中是等效的(對(duì)于默認(rèn)實(shí)現(xiàn)):
int newT = 15; int oldT = 16; // using traditional API logger.debug("Temperature set to {}. Old value was {}.", newT, oldT); // using fluent API, log message with arguments logger.atDebug().log("Temperature set to {}. Old value was {}.", newT, oldT); // using fluent API, add arguments one by one and then log message logger.atDebug().setMessage("Temperature set to {}. Old value was {}.").addArgument(newT).addArgument(oldT).log(); // using fluent API, add one argument with a Supplier and then log message with one more argument. // Assume the method t16() returns 16. logger.atDebug().setMessage("Temperature set to {}. Old value was {}.").addArgument(() -> t16()).addArgument(oldT).log();
流暢的日志記錄 API 允許指定許多不同類型的數(shù)據(jù),而org.slf4j.Logger 不會(huì)導(dǎo)致接口中方法數(shù)量的組合爆炸Logger。
現(xiàn)在可以傳遞多個(gè)Markers 、傳遞供應(yīng)商參數(shù) 或傳遞多個(gè)鍵值對(duì)。鍵值對(duì)與可以自動(dòng)解釋它們的日志數(shù)據(jù)分析器結(jié)合使用特別有用。
以下日志語(yǔ)句是等效的:
int newT = 15; int oldT = 16; // using classical API logger.debug("oldT={} newT={} Temperature changed.", oldT, newT); // using fluent API logger.atDebug().setMessage("Temperature changed.").addKeyValue("oldT", oldT).addKeyValue("newT", newT).log();
API 的鍵值對(duì)變體將鍵值對(duì)存儲(chǔ)為單獨(dú)的對(duì)象。org.slf4j.Logger當(dāng)前類 中的默認(rèn)實(shí)現(xiàn)將鍵值對(duì)作為消息的前綴。日志后端是免費(fèi)的,甚至鼓勵(lì)提供更可定制的行為。
5.5 二進(jìn)制兼容性
SLF4J 提供程序/綁定指定一個(gè)工件,例如 slf4j-jdk14.jar或slf4j-reload4j.jar ,用于將 slf4j綁定到底層日志記錄框架,例如 java.util.logging
和 reload4j
。
混合不同版本的slf4j-api.jar和 SLF4J 提供程序/綁定可能會(huì)導(dǎo)致問(wèn)題。
例如,如果您使用 slf4j-api-2.0.9.jar,那么您還應(yīng)該使用 slf4j-simple-2.0.9.jar,使用 slf4j-simple-1.5.5.jar 將不起作用。
然而,從客戶端的角度來(lái)看,SLF4J API(更具體地說(shuō)是包中的類)org.slf4j
向后兼容所有版本。
對(duì)于任何 N 和 M ,使用 slf4j-api-N.jar編譯的客戶端代碼都可以與slf4j-api-M.jar完美運(yùn)行。
您只需確保提供程序/綁定的版本與 slf4j-api 的版本匹配。罐。您不必?fù)?dān)心項(xiàng)目中給定依賴項(xiàng)使用的 slf4j-api.jar 版本。
您始終可以使用任何版本的slf4j-api.jar,只要slf4j-api.jar的版本及其提供者/綁定匹配,就應(yīng)該沒(méi)問(wèn)題。
5.6 Executive summary
優(yōu)勢(shì) | 描述 |
---|---|
日志 API 和配置分離 | 鑒于 SLF4J 提供了一個(gè)狹窄的 API,僅限于編寫日志語(yǔ)句,但沒(méi)有日志配置,SLF4J 強(qiáng)制執(zhí)行關(guān)注點(diǎn)分離。日志記錄語(yǔ)句是使用 SLF4j API 編寫的,并通過(guò)底層日志記錄后端進(jìn)行配置,通常在單個(gè)位置。 |
在部署時(shí)選擇您的日志框架 | 通過(guò)在類路徑上插入適當(dāng)?shù)?jar 文件(提供程序/綁定),可以在部署時(shí)插入所需的日志記錄框架。 |
快速失敗操作 | 在 SLF4J 初始化期間,將很早就搜索提供者。如果 SLF4J 在類路徑上找不到提供程序,它將發(fā)出一條警告消息并默認(rèn)為無(wú)操作實(shí)現(xiàn)。 |
流行日志框架的提供者 | SLF4J 支持流行的日志框架,即 reload4j、log4j 1.x、log4j 2.x、java.util.logging、Simplelogging 和 NOP。logback 、logevents、penna項(xiàng)目 原生支持 SLF4J。 |
橋接舊版日志記錄 API | JCL 在 SLF4J 上的實(shí)現(xiàn)(即 jcl-over-slf4j.jar)將允許您的項(xiàng)目逐步遷移到 SLF4J,而不會(huì)破壞與使用 JCL 的現(xiàn)有軟件的兼容性。同樣,log4j-over-slf4j.jar 和 jul-to-slf4j 模塊將允許您將 log4j 和 java.util.logging 調(diào)用分別重定向到 SLF4J。有關(guān)更多詳細(xì)信息, 請(qǐng)參閱橋接舊版 API頁(yè)面。 |
遷移您的源代碼 | slf4j-migrator實(shí)用程序可以幫助您遷移源以使用 SLF4J。 |
支持參數(shù)化日志消息 | 所有 SLF4J 提供程序/綁定都支持參數(shù)化日志消息,并顯著提高了性能 結(jié)果。 |
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Feign如何使用protobuf的類作為參數(shù)調(diào)用
這篇文章主要介紹了Feign如何使用protobuf的類作為參數(shù)調(diào)用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java 9中如何對(duì)IntegerCache進(jìn)行修改詳解
這篇文章主要給大家介紹了關(guān)于Java 9中如何對(duì)IntegerCache進(jìn)行修改的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用java9具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。2017-12-12Java實(shí)現(xiàn)抽獎(jiǎng)算法的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)抽獎(jiǎng)算法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下2022-04-04Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之醫(yī)院心理咨詢問(wèn)診系統(tǒng)的實(shí)現(xiàn)
這是一個(gè)使用了java+Spring+Maven+mybatis+Vue+mysql開發(fā)的醫(yī)院心理咨詢問(wèn)診系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有心理咨詢問(wèn)診該有的所有功能,感興趣的朋友快來(lái)看看吧2022-01-01Mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)分表
當(dāng)數(shù)據(jù)量比較多時(shí),放在一個(gè)表中的時(shí)候會(huì)影響查詢效率,本文主要介紹了Mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)分表,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01Java實(shí)現(xiàn)動(dòng)態(tài)模擬時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)動(dòng)態(tài)模擬時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12MyBatis編寫一個(gè)簡(jiǎn)單的SQL生成工具
MyBatis 是一個(gè)強(qiáng)大的數(shù)據(jù)持久化框架,它提供了一種半自動(dòng)化的 ORM 實(shí)現(xiàn)方式,本文將為大家介紹如何使用MyBatis編寫一個(gè)簡(jiǎn)單的SQL生成工具,需要的可以了解下2025-03-03Spring Cloud 專題之Sleuth 服務(wù)跟蹤實(shí)現(xiàn)方法
這篇文章主要介紹了Spring Cloud 專題之Sleuth 服務(wù)跟蹤,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08