說說java的日志框架體系是怎樣的?
Apache Commons Logging(JCL)-日志門面
Commons本身只提供日志接口,具體實現在運行時 動態尋找對應組件?思路上類似于JDBC的抽象。
JCL動態查找(綁定)日志組件原理如下:
JCL為每一種日志采用了一個適配器,具體采用哪一個,是動態根據指定順序查找classpath是否存在相應日志的實現,如果JCL運行時沒有找到任何一種第三方的日志實現,則就使用jdk14自帶的java.util.logging(JUL)。
Spring日志就是采JCL,解決了應用程序和框架日志不統一的問題,動態去尋找(應用程序配置)日志體系的實現。
默認的LogFactory是按照下列的步驟去發現并決定那個日志工具將被使用的,LogFactory按照順序尋找,找到第一個工具后中止。
1) 首先在classpath下尋找自己的配置文件commons-logging.properties,如果找到,則
使用其中定義的Log實現類;
2) 如果找不到commons-logging.properties文件,則在查找是否已定義系統環境變量
org.apache.commons.logging.Log,找到則使用其定義的Log實現類;
3) 否則,查看classpath中是否有Log4j的包,如果發現,則自動使用Log4j作為日志實現類;
4) 否則,使用JDK自身的日志實現類(JDK1.4以后才有日志實現類);
5) 否則,使用commons-logging自己提供的一個簡單的日志實現類SimpleLog;
SLF4j(Simple Logging Facade for java)-日志門面與JCL類似,本身不提供具體實現,只對外提供接口或者門面,因此它不是具體的日志解決方案,而是通過Facade Pattern 門面模式對外提供一些 java logging api,這些對外提供的核心API就是一些接口以及LoggerFactory的工程類。
與Common logging 不同的是其采用在ClassPath下尋找一下jar包來表示具體的采用哪種實現
slf4j-log4j12.jar(表示指定logh4j)slf-jdk14.jar(表示使用JUL)slf4j-jcl.jar(表示使用JCL)log4j-slf4j-impl.jar(表示指定log4j2)logback-classic(logback)SLF4j 靜態綁定日志組件原理:
使用SLF4j,如果你需要使用某一種日志實現,那么你選擇相對應的SLF4j的橋接包即可。
SLF4j提供了統一記錄日志的接口(LoggerFactory),只要接其提供的方法記錄即可。
logback是slf4j-api的天然實現,不需要你橋接包就可以使用。
上面的slf4j-log4j2,log4j-slf4j-impl,slf4j-jcl,slf4j-jdk14都是日志適配器
日志門面適配器,因為slf4j規范是后來提出來的,在此之前的日志庫是沒有實現slf4j的接口的,例如log4j;所以,在工程里要想使用 slf4j + log4j 的模式,就額外需要一個適配器(slf4j-log4j2)來解決接口不兼容的問題。日志庫適配器,在一些老的工程里,一開始為了開發簡單而直接使用了日志庫API來完成日志打印,隨著時間的推移向將原來直接調用日志庫的模式改為業界標準的門面模式(例如 slf4j+logback結合),但老工程代碼里打印的日志的地方太多,難以改動,所以需要一個適配器來完成從舊日志庫的API到slf4j的路由,這樣不改動原有代碼的情況下也能使用slf4j來統一管理日志,而且后續自由替換具體日志庫也不成問題。日志集成--slf4j + logback如果是新工程,則推薦使用slf4j + logback 模式,因為logback自身實現了slf4j的接口,無需額外引入適配器,另外logback是log4j的升級版,具備比log4j更多的優點。
日志集成-log4j + slf4j如果是老工程,則需要根據所使用的日志庫來確定門面適配器,通常情況下老工程使用的都是log4j, 因此以log4j日志庫為例,可通過以下集成。
如果老老工程直接使用了log4j日志庫提供的接口來打印日志,則還需要引入日志適配器,配置如下:
日志集成-Spring日志 + log4j2我們應用使用的是log4j2打印日志;而Spring采用的JCL中不包含log4j2,運行時,JCL從ClassPath下尋找日志的實現,如果沒有引用其他實現,最終會使用JUL實現。如下圖:
這時候會出現什么問題呢?
Spring打印日志和應用程序的打印日志不統一,錯誤排除還比較困難,而且應用程序和Spring框架,日志不統一,太亂了。
為了讓Spring和我們的應用程序,采用統一的log4j2日志體系,需要加入適配器,改善上面應用程序和框架日志的統一問題(加入適配器后),如下圖:
SLF4j+log4j2
SLF4j集成其他日志框架的方法:
常見的日志組件最佳實踐在使用SLF4J使用時,需要注意一下事項:
logger被定義為static 變量,是因為這個LOGGER與當前類綁定,避免每次都new一個新對象,造成資源浪費。
再次感謝邀請!如果對你有幫助,可以關注一下!