日誌系列-Java日誌框架簡介

日誌對於程序很重要,平常分析生產環境問題的時候,基本就靠日誌了。 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

除了這些框架外,還有其餘用途的日誌框架,好比 tinylogLogbook 等框架。微信

Slf4j 是什麼

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 是一個比較好的選擇。

後面會寫一個日誌專題系列。

(完)

關注微信公衆號,聊點其餘的

相關文章
相關標籤/搜索