一、代碼方面
- private static final Logger log = LoggerFactory.getLogger()方式
- 詳細解釋
- 這是一種傳統的獲取日志記錄器(Logger)的方式。LoggerFactory是日志框架(如 Log4j、Logback 等)提供的工廠類,用于創建Logger對象。在這里,通過調用LoggerFactory.getLogger()方法來獲取一個Logger實例。private static final修飾符表示log是一個私有、靜態、不可變的變量。靜態變量意味著它屬于類級別,在類加載時初始化,并且在整個類的生命周期內只有一個實例。私有訪問修飾符限制了對該變量的訪問只能在當前類內部進行。這種方式可以精確地控制日志記錄器的創建和配置。
- 示例
- 假設使用的是 Logback 作為日志框架,在一個 Java 類中:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyClass {private static final Logger log = LoggerFactory.getLogger(MyClass.class);public void doSomething() {log.info("開始執行doSomething方法");// 業務邏輯代碼log.info("doSomething方法執行完畢");}
}
在這個例子中,log是MyClass類的日志記錄器。在doSomething方法中,通過log.info()方法記錄了方法開始和結束的信息。
- 缺點
比較繁瑣。每次需要在類中手動聲明Logger對象,并且如果在一個項目中有大量的類需要記錄日志,這種重復的代碼會使代碼看起來不夠簡潔。
- @Slf4j注解方式
- 詳細解釋
- @Slf4j是 Lombok 庫提供的一個注解。Lombok 是一個 Java 庫,它通過注解的方式在編譯階段自動生成一些常用的代碼,比如getter、setter方法,構造函數等。當在一個類上添加@Slf4j注解時,Lombok 會在編譯時自動為這個類生成一個名為log的Logger對象,這個對象的類型和獲取方式與使用private static final Logger log = LoggerFactory.getLogger();類似,但不需要手動編寫這行代碼。這樣可以大大減少代碼的冗余,使代碼更加簡潔。
- 示例
首先需要在項目中引入 Lombok 依賴。如果是 Maven 項目,在pom.xml文件中添加以下依賴:
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version><scope>provided</scope>
</dependency>
然后在 Java 類中使用@Slf4j注解:
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class AnotherClass {public void doAnotherThing() {log.info("開始執行doAnotherThing方法");// 業務邏輯代碼log.info("doAnotherThing方法執行完畢");}
}
這里可以看到,沒有手動聲明Logger對象,但是通過@Slf4j注解,同樣可以使用log對象來記錄日志。
- 優點
簡潔性。通過使用注解,減少了手動聲明日志記錄器的代碼,使代碼更加緊湊,特別是在有大量類需要記錄日志的情況下,能夠顯著提高代碼的可讀性和可維護性。
二、編譯階段的差異
-
private static final Logger log = LoggerFactory.getLogger()
- 這是 Java 原生的代碼方式,編譯器會按照常規的代碼編譯流程進行處理。在運行時,Logger對象會按照代碼的初始化順序在類加載時被創建。
-
@Slf4j
- 在編譯階段,Lombok 的注解處理器會介入。它會分析帶有@Slf4j注解的類,然后根據類的信息自動生成獲取Logger對象的代碼。這個過程對于開發者是透明的,但實際上是在編譯時對代碼進行了修改和擴展。例如,它會生成類似于private static final Logger log = LoggerFactory.getLogger(MySlf4jLoggerClass.class);這樣的代碼。
三、靈活性與兼容性方面
- private static final Logger log = LoggerFactory.getLogger()
- 這種方式更加靈活。因為是手動編寫獲取Logger對象的代碼,開發者可以根據具體的需求進行定制。例如,可以通過不同的參數來獲取不同配置的Logger對象,或者在一些特殊的環境下(如不能使用 Lombok 的情況),依然能夠正常獲取和使用Logger對象。
- @Slf4j
- 依賴于 Lombok 庫。如果項目沒有引入 Lombok 或者 Lombok 版本不兼容等情況,使用@Slf4j就會出現問題。不過,在大多數支持 Lombok 的現代 Java 開發環境中,它能很好地工作,并且提供了便捷的日志記錄方式。但是在一些嚴格的開發環境或者對外部庫有限制的場景下,其使用可能會受到限制。
小結
@Slf4j注解提供了一種更簡潔的方式來獲取日志記錄器,而傳統的private static final Logger log = LoggerFactory.getLogger()方式則更加靈活,在某些復雜的日志配置場景或者無法使用 Lombok 的情況下仍然是一種有效的方式。