Lombok的@CustomLog,公司多場景日誌爽多了!

語言: CN / TW / HK

開發環境

  • JDK 1.8
  • Lombok - 1.18.16

背景

公司因為開源節流需要,需要區分重要日誌非重要日誌,一個月光日誌的費用有30w之多確實恐怖了一些(PS:夠幾十個程式設計師的工資了)。所以,公司要求將日誌區分開,去除一些非必要的日誌,記錄的日誌也最多保留15天,重要日誌30天。

為了區分場景日誌,單獨搞了個Logger日誌記錄器來採集日誌,為了繼續用註解的方式在專案中,這時就需要@CustomLog註解了,方便的將多個日誌記錄器整合在一起,話不多說,開幹!

如果在專案中直接使用@CustomLog註解,你會看到如下圖的報錯資訊: image.png

這個時候需要新增配置檔案lombok.config,在專案中就可以直接使用了!

特別注意:配置檔案的位置需要在@CustomLog註解所在檔案的上層目錄,我為了方便通常直接放在模組的根目錄專案的根目錄進行使用。

image.png

新增的配置資訊如下: lombok.log.custom.declaration=com.lombok.log.IntegrationLog com.lombok.log.IntegrationLog.getLogger(TYPE) 注意,com.lombok.log.IntegrationLogcom.lombok.log.IntegrationLog.getLogger(TYPE)中間是有空格的,這樣才能生效。至於getLogger的小括號內部,有兩個值可以使用,分別是TYPE(類的型別)NAME(類的名稱)

TYPE方式生成的程式碼

private static final IntegrationLog log = IntegrationLog.getLogger(LogPrintService.class);

NAME方式生成的程式碼

private static final IntegrationLog log = IntegrationLog.getLogger("com.lombok.service.LogPrintService"); 配置成功的前提,是你的類要符合配置要求,也就是按照lombok的規範去定義類即可。

程式碼部分

為了方便鑑將多個日誌記錄器放在一起,必然需要一個整合類,這裡我定義一個名為IntegrationLog的類,除了預設的Logger日誌物件,還有一個業務記錄器物件BusinessLog,用於記錄比較重要的日誌。當定義好此類後,完成上述的配置即可。

```java public class IntegrationLog {

private final Logger logger;

private final BusinessLog bizLogger;

private IntegrationLog(Class<?> clazz) {
    this.logger = LoggerFactory.getLogger(clazz);
    this.bizLogger = BusinessLog.getLogger(clazz);
}

public static IntegrationLog getLogger(Class<?> clazz) {
    return new IntegrationLog(clazz);
}

public void info(String format, Object... args) {
    logger.info(format, args);
}

public void bizInfo(String format, Object... args) {
    bizLogger.info(format, args);
}

} ```

再看看註解使用的程式碼部分

程式碼中我們就可以暢快的使用了,一個log物件包括了我們想要的方法。

java @CustomLog public class LogPrintService { public void printLog() { log.bizInfo("需要多付錢的日誌"); log.info("預設日誌"); } } 通過檢視原始碼,就可以看到Lombok給我們生成了什麼樣的程式碼: ```java public class LogPrintService { private static final IntegrationLog log = IntegrationLog.getLogger(LogPrintService.class);

public LogPrintService() {
}

public void printLog() {
    log.bizInfo("哈哈哈哈", new Object[0]);
}

} ``` 其實Lombok做的事情,就是幫我們建立了一個例項,簡單易懂。

參考文獻

  • Lombok的Log介紹 - http://projectlombok.org/features/log