日誌對於程序很重要,平常分析生產環境問題的時候,基本就靠日誌了。 Java 中有不少記錄日誌的工具,不少時候不太容易分清楚,好比一會 SLF4J
,一會 Log4j
,後面還有 Log4j2
,讓人傻傻分不清。html
Java 中主流的日誌框架以下:java
Log4j 是一個很經典的日誌框架,有很普遍的應用,可是在 2015 年官方宣佈不在維護,轉而推廣 Log4j2,Log4j2 是 Log4j 的升級版,Log4j2 吸取了 Log4j 和其餘框架的優勢,同時也規避了 Log4j 存在的問題。git
Logback 的做者與 Log4j 的做者是同一我的,Logback 的實現方式與 Log4j 的實現方式差很少,可是提高了性能和一些配置方式,原生支持 Slf4j。github
JDK 中自己的日誌 API,缺少緩衝處理,在生產環境對性能的影響很大,相比於專門的日誌框架功能差太多,因此不會用到生產環境中。apache
除了這些框架外,還有其餘用途的日誌框架,好比 tinylog,Logbook 等框架。微信
Slf4j 是一套標準的日誌接口。它自己是沒有記錄日誌的功能的,須要依賴上面提到的那些日誌框架。使用 Slf4j 的好處就是日誌具體的記錄方式和接口徹底分離了。即便要換其餘的日誌框架,也不用改動代碼。多線程
假如你須要使用日誌打印 Hello World
,在 Log4j 中,須要這麼作:框架
import org.apache.log4j.Logger;
public class Log4jDemo{
private static Logger log = Logger.getLogger(Log4jDemo.class.getName());
public static void main(String[] args){
log.info("Hello World");
}
}
複製代碼
在 Log4j2 中,須要這麼作:異步
import org.apache.log4j.LogManager
import org.apache.log4j.Logger;
public class Log4j2Demo{
private static Logger log = LogManager.getLogger(Log4jDemo.class);
public static void main(String[] args){
log.info("Hello World");
}
}
複製代碼
不一樣的日誌框架使用的方式不同,這樣一旦須要換一個日誌框架,將會是一件很是痛苦的事情,若是使用 Slf4j,不論底層使用的是哪個日誌框架,均可以使用相同的形式來記錄日誌:工具
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jDemo {
private statis Logger logger = LoggerFactory.getLogger(Slf4jDemo.class);
public static void main(String[] args) {
logger.info("Hello world.");
}
}
複製代碼
因此不論具體使用的是什麼日誌框架,均可以在上面套一個 Slf4j
。
Apache Commons Logging 的目標與 Slf4j 是一致的,可是 Apache Commons Logging 的 API 沒有 Slf4j 的豐富,並且限制太多,天然就沒有 Slf4j 受歡迎。
那麼問題來了,任何框架都須要應用到實際的項目當中。
根據上面的討論, Slf4j 確定是須要的,那麼底層的日誌框架應該使用哪一個。Log4j 確定就不考慮了,Log4j2 就是爲了幹掉 Log4j 而誕生的。因此選擇就集中在了 Log4j2 與 Logback 之間。
在生產環境中,會產生大量的日誌,這些日誌最後都是須要寫入到磁盤當中的。因此 IO 性能會影響日誌框架的性能。而提高 IO 性能的有效方法就是提供緩衝區,先把日誌寫入到緩衝區,而後在特定的條件下將日誌寫入到磁盤當中。Log4j2 和 Logback 都提供了緩衝能力,也就是異步寫入日誌的能力。
性能測試顯示,Log4j2 在記錄同步日誌的性能上比 Logback 要好 25% 左右,是全部的日誌框架中最好的。Log4j2 和 Logback 在異步日誌上性能差很少,可是 Logback 在記錄異步日誌功能上存在一些未解決的 bug,因此若是要使用異步日誌,就不推薦使用 Logback。而且 Log4j2 比其餘的日誌框架更能適應多線程的環境。
其餘日誌框架有的優勢, Log4j2 都有,其餘框架有的問題,Log4j2 都沒有,因此選擇 Log4j2 大機率是不會錯的,因此 Slf4j + Log4j2
是一個比較好的選擇。
後面會寫一個日誌專題系列。
(完)
關注微信公衆號,聊點其餘的