最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lombok @Slf4j log對象沒有info等方法不可用問題及解決

 更新時間:2024年12月27日 11:03:04   作者:七維大腦  
本文主要介紹了如何解決Spring Boot項目中的日志依賴沖突問題,以及如何使用Lombok和SLF4J進行日志記錄,Lombok通過生成Logger對象簡化了日志記錄,而SLF4J提供了一個統(tǒng)一的日志接口,允許開發(fā)者在運行時選擇不同的日志實現(xiàn)

1. Lombook插件沒安裝(幾率很小)

這個一般是對于低版本Idea可能會出現(xiàn),可能是idea沒有安裝lombook插件導致的,去plugin里面安裝下Lombok插件就可以了,但是幾率很小.

高版本idea可以直接排除。

2. SpringBoot的項目依賴沖突

排除 原因一 后可能是由于日志實現(xiàn)在springboot的starter中已經有了,但是又導入了logback-classic,排除沖突問題。

3. 普通項目

非SpringBoot項目中,用到Lombook,但是只導入了Lombook的依賴,只是導入了日志的門面。

3.1 分析原因

下圖為無info等方法截圖:

<dependencies>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.28</version>
    </dependency>
</dependencies>

可以看到,我只導入了lombok的依賴。所以沒有info等方法,所以我們還需要導入日志的實現(xiàn)。也就是logback-classic。(版本號根據實際而定)

3.2 導入所需依賴

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

下圖為導入日志實現(xiàn)的依賴的截圖:

3.3 測試效果

我們新建一個測試類,在類上導入@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庫)提供的一個注解,它簡化了在 Java 類中添加日志記錄的過程。@Slf4j 注解會自動生成一個名為 logLogger 對象,使得在類中使用日志功能更加便捷。

具體來說,@Slf4j 注解在類上使用時,Lombok會在編譯時自動為該類生成以下代碼:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Slf4j
public class MyClass {
    // 自動生成的 Logger 對象
    private static final Logger log = LoggerFactory.getLogger(MyClass.class);

    // 類的其他代碼...
}

使用 @Slf4j 注解后,你可以直接在類中使用 log 對象進行日志記錄,而無需手動創(chuàng)建 Logger 對象。

例如:

@Slf4j
public class MyClass {
    public void myMethod() {
        log.info("This is an info message");
        log.error("This is an error message");
    }
}

上述代碼中,@Slf4j 注解自動創(chuàng)建了名為 log 的靜態(tài) Logger 對象,你可以使用它調用日志級別的方法,如 info、error 等。

這樣的自動生成減少了樣板代碼,使得日志的添加和管理更加簡單。

5. SLF4J介紹

Simple Logging Facade for Java (SLF4J) 用作各種日志框架(例如 java.util.logging、log4j 1.x、reload4j 和 logback)的簡單外觀或抽象。SLF4J 允許最終用戶在部署時插入所需的日志記錄框架 。請注意,啟用 SLF4J 的庫/應用程序意味著僅添加一個強制依賴項,即 slf4j-api-2.0.9.jar。

5.1 Maven導入

考慮到 Maven 的傳遞依賴規(guī)則,對于“常規(guī)”項目(不是庫或框架),可以通過單個依賴項聲明來完成聲明日志記錄依賴項。

5.1.1 SLF4J API

SLF4J API 包含在“org.slf4j:slf4j-api”工件中。您可以在pom.xml文件中顯式聲明對其的依賴關系,如下所示。請注意,大多數(shù)日志記錄實現(xiàn)都會自動引入 slf4j-api 作為依賴項。然而,聲明對 slf4j-api 的顯式依賴關系通常是一個好主意,以便借助 Maven 的“最近定義”依賴關系中介規(guī)則修復項目中 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”聲明為依賴項你的 pom.xml文件如下所示。除了 logback-classic-1.3.6.jar之外,這還會將slf4j-api-2.0.9.jar以及l(fā)ogback-core-1.3.6.jar引入您的項目中。

請注意,顯式聲明對logback-core-1.3.6或 slf4j-api-2.0.9.jar的依賴關系 并沒有錯,并且可能需要借助 Maven 的“最近定義”依賴關系中介規(guī)則來強制使用所述工件的正確版本。

<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”聲明為依賴項你的 pom.xml文件如下所示。除了 logback-classic-1.4.6.jar之外,這還會將slf4j-api-2.0.9.jar以及l(fā)ogback-core-1.4.6.jar 引入您的項目中。

請注意,顯式聲明對logback-core-1.4.6 或slf4j-api-2.0.9.jar的依賴關系并沒有錯,并且可能需要借助 Maven 的“最近定義”依賴關系中介規(guī)則來強制使用所述工件的正確版本。

<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”作為依賴項, 如下所示。除了 slf4j-reload4j-2.0.9.jar之外,這還會將slf4j-api-2.0.9.jar以及reload4j-1.2.25.jar引入您的項目中。

請注意,顯式聲明對reload4j-1.2.25.jar或 slf4j-api-2.0.9.jar 的依賴關系 并沒有錯,并且可能需要借助 Maven 的“最近定義”依賴關系中介規(guī)則來強制使用所述工件的正確版本。

<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”作為依賴項,如下 所示。除了 slf4j-jdk14-2.0.9.jar之外,這還會將slf4j-api-2.0.9.jar引入您的項目中。

請注意,顯式聲明對slf4j-api-2.0.9.jar的依賴關系 并沒有錯,并且可能需要借助 Maven 的“最近定義”依賴關系中介規(guī)則來強制使用所述工件的正確版本。

<dependency> 
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-jdk14</artifactId>
  <version>2.0.9</version>
</dependency>

5.1.7 SLF4J SIMPLE

如果您希望使用 org.slf4j.simple 作為底層日志記錄實現(xiàn),您所需要做的就是在 pom.xml 文件中聲明“org.slf4j:slf4j-simple”作為依賴項,如下所示 。除了 slf4j-simple-2.0.9.jar之外,這還會將slf4j-api-2.0.9.jar引入您的項目中。

請注意,顯式聲明對slf4j-api-2.0.9.jar的依賴關系 并沒有錯,并且可能需要借助 Maven 的“最近定義”依賴關系中介規(guī)則來強制使用所述工件的正確版本。

<dependency> 
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>2.0.9</version>
</dependency>

5.2 HelloWorld

按照編程傳統(tǒng)的慣例,下面的示例說明了使用 SLF4J 輸出“Hello world”的最簡單方法。

首先獲取名為“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");
  }
}

要運行此示例,您首先需要獲取 slf4j工件。完成后,將文件 slf4j-api-2.0.9.jar添加到類路徑中。

編譯并運行HelloWorld將在控制臺上打印以下輸出:

SLF4J:未找到 SLF4J 提供程序。
SLF4J:默認為無操作 (NOP) 記錄器實現(xiàn)
SLF4J:請參閱 https://www.slf4j.org/codes.html#noProviders 了解更多詳細信息。

如果您使用的是 SLF4J 1.7 或更早版本,則消息將為:

SLF4J:無法加載類“org.slf4j.impl.StaticLoggerBinder”。
SLF4J:默認為無操作 (NOP) 記錄器實現(xiàn)
SLF4J:請參閱 https://www.slf4j.org/codes.html#StaticLoggerBinder 了解更多詳細信息。

打印此警告是因為在類路徑上找不到 slf4j 提供程序(或綁定)。

一旦您將提供程序添加到類路徑中,該警告就會消失。假設您添加 slf4j-simple-2.0.9.jar以便您的類路徑包含:

  • slf4j-api-2.0.9.jar
  • slf4j-simple-2.0.9.jar

編譯并運行HelloWorld現(xiàn)在將在控制臺上產生以下輸出:

0 [主要] INFO HelloWorld - 你好世界

5.3 典型使用模式

下面的示例代碼說明了 SLF4J 的典型使用模式。請注意第 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.");

以下日志語句在其輸出中是等效的(對于默認實現(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ù)據,而org.slf4j.Logger 不會導致接口中方法數(shù)量的組合爆炸Logger。

現(xiàn)在可以傳遞多個Markers 、傳遞供應商參數(shù) 或傳遞多個鍵值對。鍵值對與可以自動解釋它們的日志數(shù)據分析器結合使用特別有用。

以下日志語句是等效的:

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 的鍵值對變體將鍵值對存儲為單獨的對象。org.slf4j.Logger當前類 中的默認實現(xiàn)將鍵值對作為消息的前綴。日志后端是免費的,甚至鼓勵提供更可定制的行為。

5.5 二進制兼容性

SLF4J 提供程序/綁定指定一個工件,例如 slf4j-jdk14.jar或slf4j-reload4j.jar ,用于將 slf4j綁定到底層日志記錄框架,例如 java.util.loggingreload4j

混合不同版本的slf4j-api.jar和 SLF4J 提供程序/綁定可能會導致問題。

例如,如果您使用 slf4j-api-2.0.9.jar,那么您還應該使用 slf4j-simple-2.0.9.jar,使用 slf4j-simple-1.5.5.jar 將不起作用。

然而,從客戶端的角度來看,SLF4J API(更具體地說是包中的類)org.slf4j向后兼容所有版本。

對于任何 N 和 M ,使用 slf4j-api-N.jar編譯的客戶端代碼都可以與slf4j-api-M.jar完美運行。

您只需確保提供程序/綁定的版本與 slf4j-api 的版本匹配。罐。您不必擔心項目中給定依賴項使用的 slf4j-api.jar 版本。

您始終可以使用任何版本的slf4j-api.jar,只要slf4j-api.jar的版本及其提供者/綁定匹配,就應該沒問題。

5.6 Executive summary

優(yōu)勢描述
日志 API 和配置分離鑒于 SLF4J 提供了一個狹窄的 API,僅限于編寫日志語句,但沒有日志配置,SLF4J 強制執(zhí)行關注點分離。日志記錄語句是使用 SLF4j API 編寫的,并通過底層日志記錄后端進行配置,通常在單個位置。
在部署時選擇您的日志框架通過在類路徑上插入適當?shù)?jar 文件(提供程序/綁定),可以在部署時插入所需的日志記錄框架。
快速失敗操作在 SLF4J 初始化期間,將很早就搜索提供者。如果 SLF4J 在類路徑上找不到提供程序,它將發(fā)出一條警告消息并默認為無操作實現(xiàn)。
流行日志框架的提供者SLF4J 支持流行的日志框架,即 reload4j、log4j 1.x、log4j 2.x、java.util.logging、Simplelogging 和 NOP。logback 、logevents、penna項目 原生支持 SLF4J。
橋接舊版日志記錄 APIJCL 在 SLF4J 上的實現(xiàn)(即 jcl-over-slf4j.jar)將允許您的項目逐步遷移到 SLF4J,而不會破壞與使用 JCL 的現(xiàn)有軟件的兼容性。同樣,log4j-over-slf4j.jar 和 jul-to-slf4j 模塊將允許您將 log4j 和 java.util.logging 調用分別重定向到 SLF4J。有關更多詳細信息, 請參閱橋接舊版 API頁面。
遷移您的源代碼slf4j-migrator實用程序可以幫助您遷移源以使用 SLF4J。
支持參數(shù)化日志消息所有 SLF4J 提供程序/綁定都支持參數(shù)化日志消息,并顯著提高了性能 結果。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java操作json對象出現(xiàn)StackOverflow錯誤的問題及解決

    java操作json對象出現(xiàn)StackOverflow錯誤的問題及解決

    這篇文章主要介紹了java操作json對象出現(xiàn)StackOverflow錯誤的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Springmvc Controller接口代碼示例

    Springmvc Controller接口代碼示例

    這篇文章主要介紹了Springmvc Controller接口代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java 入門圖形用戶界面設計之列表框JList

    Java 入門圖形用戶界面設計之列表框JList

    圖形界面(簡稱GUI)是指采用圖形方式顯示的計算機操作用戶界面。與早期計算機使用的命令行界面相比,圖形界面對于用戶來說在視覺上更易于接受,本篇精講Java語言中關于圖形用戶界面的列表框JList
    2022-02-02
  • mybatis的if判斷不要使用boolean值的說明

    mybatis的if判斷不要使用boolean值的說明

    這篇文章主要介紹了mybatis的if判斷不要使用boolean值的說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Javaweb El表達式實例詳解

    Javaweb El表達式實例詳解

    EL全稱 Expression Language(表達式語言),這篇文章主要介紹了Javaweb El表達式實例詳解的相關資料,非常具有參考借鑒價值,感興趣的朋友一起學習吧
    2016-05-05
  • 深入解析Java中的Classloader的運行機制

    深入解析Java中的Classloader的運行機制

    這篇文章主要介紹了Java中的Classloader的運行機制,包括從JVM方面講解類加載器的委托機制等,需要的朋友可以參考下
    2015-11-11
  • @Column映射不一致的解決

    @Column映射不一致的解決

    這篇文章主要介紹了@Column映射不一致的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java聊天室之實現(xiàn)運行服務器與等待客戶端連接

    Java聊天室之實現(xiàn)運行服務器與等待客戶端連接

    這篇文章主要為大家詳細介紹了Java簡易聊天室之實現(xiàn)運行服務器程序與等待客戶端程序連接功能,文中的示例代碼講解詳細,需要的可以了解一下
    2022-10-10
  • Java漢字轉換拼音(大小寫)實例詳解

    Java漢字轉換拼音(大小寫)實例詳解

    這篇文章主要給大家介紹了關于Java漢字轉換拼音(大小寫)的相關資料,包括使用java.text.Normalizer類和正則表達式進行大小寫轉換,通過示例代碼和場景說明,幫助讀者在實際項目中實現(xiàn)漢字與拼音的轉換,需要的朋友可以參考下
    2025-05-05
  • java多線程開發(fā)ScheduledExecutorService簡化方式

    java多線程開發(fā)ScheduledExecutorService簡化方式

    這篇文章主要為大家介紹了java多線程開發(fā)ScheduledExecutorService的簡化方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03

最新評論

商洛市| 房产| 合江县| 孟村| 青阳县| 河源市| 恭城| 罗平县| 饶平县| 汉中市| 墨脱县| 集安市| 资兴市| 浮山县| 莱西市| 句容市| 凤山县| 三江| 稷山县| 太仆寺旗| 紫金县| 昌吉市| 临高县| 淮阳县| 称多县| 渭南市| 大港区| 高雄县| 霍城县| 伊春市| 嘉峪关市| 甘南县| 明光市| 莆田市| 永胜县| 札达县| 类乌齐县| 阳山县| 无极县| 宁阳县| 巴楚县|