slf4j日志引用正確姿勢


slf4j是為了便於不同日志框架的切換,而設計的日志系統門面,它支持的日志框架包括:java.util.logging, logback and log4j.它的使用很簡單,只需要引入slf4j-api-${project.version}.jar即可,但實際項目中它需要配合相應的日志框架使用.這里只是簡單介紹一下slf4j的引用.

1 使用slf4j需要的maven依賴

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>2.0.0-alpha1</version>
    </dependency>

2 引入maven依賴后需要在需要日志輸出的類引入Logger
Logger logger = LoggerFactory.getLogger(HelloWorld.class);

示例代碼:

package com.liu;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.invoke.MethodHandles;

public class HelloWorld {
    final static Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
    public static void main(String[] args) {
        logger.info("Hello World");
    }
}

執行結果:

由於只有slf4j門面,無法輸出具體的日志信息,只有對於的加載信息

如果想看到輸出結果,引入門面后的具體日志框架即可,這里使用slf4j-simple作為示例:
maven依賴:

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

執行結果:
[main] INFO com.liu.HelloWorld - Hello World

3 引入Logger有三種方式
a.類實例變量

public class HelloWorld {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
}

b.靜態變量

public class HelloWorld {
    final static Logger logger = LoggerFactory.getLogger(HelloWorld.class);
}

因為不同類之間使用Logger都需要粘貼復制,同時修改映射的Logger名稱,使用MethodHandles.lookup().lookupClass()方法可以獲取到對應的類的class.
即: final static Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

c.lombok注解(這種也是靜態變量方式,只是看着更簡潔一些,它需要引入lombok依賴)

@Slf4j
public class HelloWorld {
}

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.16.16</version>
</dependency>

4 干貨
前面說的都是基本用法,這里主要想說一下Logger引入方式中,官方之前是推薦使用靜態變量方式的,但是現在根據情況有所區別:
a.靜態變量方式
優點: 應用內共用;省CPU,主類初始化時,只需要一次分配;省內存;
缺點:1. 在應用間共享庫,不能發揮倉庫選擇器優勢.如果SLF4J綁定和底層API附帶每一個應用(不在應用間分享),那么每個應用仍將有自己的日志環境。2.IOC不友善
b.實例變量方式
優點:當底層日志系統是logback-classic時,可發揮倉庫選擇器的優勢,甚至應用間的共享庫.
缺點:耗CPU;耗內存

參考資料:
slf4j官方對於相關問題解釋 http://www.slf4j.org/faq.html
slf4j官方對於相關問題解釋翻譯 https://yq.aliyun.com/articles/86347
@Slf4j注解 https://projectlombok.org/api/lombok/extern/slf4j/Slf4j.html
@Slf4j注解作用 https://www.jianshu.com/p/6e137ee836a1
lombok日志相關注解及其作用 https://projectlombok.org/features/log


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM