專門制作視頻的軟件視頻優(yōu)化軟件
前言
Slf4j
SLF4J,全稱 Simple Logging Facade for Java,是一個用于Java編程語言的日志系統(tǒng)抽象層。它為多種現(xiàn)有日志框架(例如Log4j、java.util.logging等)提供了統(tǒng)一的接口, 但自身并不實現(xiàn)日志功能。
SLF4J 允許用戶在部署時選擇適當?shù)娜罩編?#xff08;即日志框架),比如 Logback、Log4j 等。
Logback
Logback 是一個實現(xiàn)日志功能的庫,它由Log4j的創(chuàng)建者設(shè)計。Logback被設(shè)計成Log4j的一個卓越替代品,它具有更好的性能、自動重加載配置文件、更豐富的日志格式以及內(nèi)置日志歸檔等特點。
簡單來說,SLF4J為Java提供了一個統(tǒng)一的日志接口,而Logback是一個具體的日志庫,可以與SLF4J API結(jié)合起來使用。
注意,其它日志實現(xiàn)如log4j等結(jié)合slf4j的時候是需要橋接包,而logback是直接實現(xiàn)了slf4j。
Slf4j初始化源碼分析
slf4j在代碼中初始化一個Logger對象時,如下,調(diào)用LoggerFactory.getLogger()方法:
private final Logger logger = LoggerFactory.getLogger(this.getClass());
查看getLogger方法:
public static Logger getLogger(String name) { // logback實現(xiàn)了slf4j的ILoggerFactory接口,關(guān)鍵也在于這個地方ILoggerFactory iLoggerFactory = getILoggerFactory(); return iLoggerFactory.getLogger(name);
}
logback針對ILoggerFactory的實現(xiàn)類是:ch.qos.logback.classic.LoggerContext。
所以可以直接查看LoggerContext.getLogger()方法。
可以看到最終是調(diào)用到這個方法:
這個地方不是配方重點,這里分析下初始化的時候如何構(gòu)造LoggerContext實例:
ILoggerFactory iLoggerFactory = getILoggerFactory();
通過追蹤方法調(diào)用,可以看到最終調(diào)用的是這個bind()方法(具體調(diào)用的源碼細節(jié),可以自己點進去看一下,代碼不多,不啰嗦了):
private final static void bind() {try {Set<URL> staticLoggerBinderPathSet = null;// 不檢查安卓系統(tǒng)的if (!isAndroid()) {// 這里是找到所有org/slf4j/impl/StaticLoggerBinder.class的jar路徑staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();// 如果項目有多個日志框架的實現(xiàn),平常啟動項目不是會打印一些日志:Class path contains multiple SLF4J bindings.等// 就是這這個地方打印的,日志實現(xiàn)沖突reportMultipleBindingAmbiguity(staticLoggerBinderPathSet);}// 每個實現(xiàn)slf4j的日志或者橋接包都會有這個org/slf4j/impl/StaticLoggerBinder.class類StaticLoggerBinder.getSingleton();INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;reportActualBinding(staticLoggerBinderPathSet);} catch (NoClassDefFoundError ncde) {// 下面代碼忽略了} catch (java.lang.NoSuchMethodError nsme) {} catch (Exception e) {failedBinding(e);throw new IllegalStateException("Unexpected initialization failure", e);} finally {postBindCleanUp();}}
StaticLoggerBinder.getSingleton();這個注釋里說了,每個實現(xiàn)或者橋接包都有這個類的,比如logback:
這個地方也是slf4j初始化的精髓,沒有這個類就拋異常了。
而關(guān)于StaticLoggerBinder的初始化,也很平常:
就是通過靜態(tài)代碼塊來初始化logback了。