SLF4J原始碼解析(一)

2021-09-24 06:25:12 字數 2588 閱讀 4678

閱讀原始碼之前,首先提幾個問題

帶著上面的兩個問題看下原始碼

bind()方法中通過呼叫findpossiblestaticloggerbinderpathset()方法來查詢日誌框架的繫結

// org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar!/org/slf4j/logge***ctory.class

private

static

final

void

bind

() // ...

}複製**

findpossiblestaticloggerbinderpathset()方法中通過classloader或者logge***ctoryclassloader來獲取名為"static_logger_binder_path"的resources

// org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar!/org/slf4j/logge***ctory.class

static setfindpossiblestaticloggerbinderpathset

() else

while(paths.hasmoreelements())

} catch (ioexception var4)

return staticloggerbinderpathset;

}複製**

這裡拿整合log4j舉例,"org/slf4j/impl/staticloggerbinder.class"就在log4j的log4j-slf4j-impl庫中,這個類負責初始化log4j相關的類。staticloggerbinder實現了logge***ctorybinder介面。

// org/apache/logging/log4j/log4j-slf4j-impl/2.11.1/log4j-slf4j-impl-2.11.1.jar!/org/slf4j/impl/staticloggerbinder.class

// 這裡的包名定義為org.slf4j.impl,使得上述第2步的class loader可以載入到這個類

package org.slf4j.impl;

public

final

class

staticloggerbinder

implements

logge***ctorybinder

複製**

其他日誌框架也定義了staticloggerbinder類,且實現了logge***ctorybinder介面。 例如: logback,jcl

// ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/staticloggerbinder.class

// 這裡的包名定義為org.slf4j.impl,使得上述第2步的class loader可以載入到這個類

package org.slf4j.impl;

public

class

staticloggerbinder

implements

logge***ctorybinder

複製**

// org/slf4j/slf4j-jcl/1.7.25/slf4j-jcl-1.7.25.jar!/org/slf4j/impl/staticloggerbinder.class

// 這裡的包名定義為org.slf4j.impl,使得上述第2步的class loader可以載入到這個類

package org.slf4j.impl;

public

class

staticloggerbinder

implements

logge***ctorybinder

複製**

slf4j通重載入各個底層日誌框架橋接庫的org/slf4j/impl/staticloggerbinder.class來載入初始化對應的日誌框架。

slf4j-api中的logge***ctory中,在上述第2步返回staticloggerbinderpathset後,會立馬呼叫 reportmultiplebindingambiguity(staticloggerbinderpathset)方法來檢測是否有多個binding。如果有多個binding,就輸出錯誤資訊"class path contains multiple slf4j bindings."

private

static

void

reportmultiplebindingambiguity

(setbinderpathset)

util.report("see for an explanation.");

}}複製**

**中使用slf4j來記錄日誌,可以任意切換底層日誌框架而不需要修改**,只需要更改依賴以及日誌配置檔案即可。

SLF4J原始碼解析(一)

閱讀原始碼之前,首先提幾個問題 帶著上面的兩個問題看下原始碼 bind 方法中通過呼叫findpossiblestaticloggerbinderpathset 方法來查詢日誌框架的繫結 findpossiblestaticloggerbinderpathset 方法中通過classloader或者...

slf4j使用 日誌

slf4j使用 注意jar版本對應 slf4j所提供的核心api是一些介面以及乙個logge ctory的工廠類。而在使用slf4j的時候,不需要在 中或配置檔案中指定你打算用那個具體的日誌系統。只需要在專案中加入定的slf4j logo.jar包就可以。這個和spring的ioc思想有點像,想用哪...

解決slf4j 衝突

發現配置的logback.xml檔案沒有起作用,於是分析了一下啟動log,發現log 現了slf4j衝突異常 slf4j class path contains multiple slf4j bindings.slf4j failed to load class org.slf4j.impl.sta...