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
