摘要:方法會調(diào)即啟動當前的,一般就是,若返回為空,則調(diào)。若存在多個日志框架,則類加載的有多個,所以是為載入。的方法會調(diào)用,若返回的大小超過,則警告。通過完成初始化,即實例化具體的賦值給內(nèi)部的,如。
SLF4J(Simple logging Facade for Java)是一個日志框架的適配器。
如果一個項目已經(jīng)使用了log4j,而你加載了Apache Active MQ——它依賴于于另外一個日志類庫logback,那么你就需要把logback也加載進來。但如果Apache Active MQ使用了SLF4J,你可以繼續(xù)使用log4j,而無需加載和維護一個新的日志框架。或者添加XXX-over-slf4j.jar可以將xxx的日志輸出轉(zhuǎn)向到slf4j,然后slf4j將日志交由真正的日志實現(xiàn)框架來輸出
幾個jar提一下:
jcl-over-slf4j 將Commons Logging API輸出轉(zhuǎn)向到slf4j輸出。
log4j-1.2-api 將log4j適配到log4j2,從而程序不用修改。
log4j-jcl 將Commons Logging API輸出轉(zhuǎn)向到log4j2輸出。
關(guān)鍵在于slf4j-api-xxx.jar中org.slf4j.LoggerFactory:
// org/slf4j/impl/StaticLoggerBinder.class為log4j-slf4j-impl-xxxjar中的類,所以用字符串聲明,避免具體依賴。 private static String STATIC_LOGGER_BINDER_PATH = "org/slf4j/impl/StaticLoggerBinder.class"; private static SetfindPossibleStaticLoggerBinderPathSet() { // use Set instead of list in order to deal with bug #138 // LinkedHashSet appropriate here because it preserves insertion order during iteration Set staticLoggerBinderPathSet = new LinkedHashSet (); try { //一般就是AppClassLoader ClassLoader loggerFactoryClassLoader = LoggerFactory.class .getClassLoader(); Enumeration paths; //每一種類加載器加載指定的*.class文件會得到不同的Class,這里必須要保證LoggerFactory的類加載器與StaticLoggerBinder的類加載是相同的。 //ClassLoader.getSystemResources方法會調(diào)getSystemClassLoader()即啟動當前application的classloader,一般就是AppClassLoader,若返回為空,則調(diào)getBootstrapResources()。 //若存在多個日志框架,則類加載的URL有多個,所以是Enumeration if (loggerFactoryClassLoader == null) {//LoggerFactory為Bootstrap Loader載入。 paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH); } else { paths = loggerFactoryClassLoader .getResources(STATIC_LOGGER_BINDER_PATH); } while (paths.hasMoreElements()) { URL path = (URL) paths.nextElement(); staticLoggerBinderPathSet.add(path); } } catch (IOException ioe) { ...... } return staticLoggerBinderPathSet; }
LoggerFactory的bind()方法會調(diào)用findPossibleStaticLoggerBinderPathSet(),若返回Set的大小超過1,則警告。通過StaticLoggerBinder.getSingleton()完成初始化,即實例化具體的factory賦值給內(nèi)部的ILoggerFactory,如 loggerFactory = new Log4jLoggerFactory();。
不同的日志框架有相應(yīng)的不同的xxx-slf4j-impl.jar,不同的StaticLoggerBinder.class決定了slf4j使用哪種日志框架。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67266.html
摘要:日志消息,是換行符如果使用作為日志配置文件,還要使用功能,會有以下錯誤切換日志框架可以按照的日志適配圖,進行相關(guān)的切換的方式切換為 三、日志 1、日志框架 小張;開發(fā)一個大型系統(tǒng); 1、System.out.println();將關(guān)鍵數(shù)據(jù)打印在控制臺;去掉?寫在一個文件? 2、框架來記錄系統(tǒng)的一些運行時信息;日志框架 ; zhanglogging.jar; 3、高大上的幾個功能?異步...
摘要:想要看級別的信息,你需要在啟動時傳入這個系統(tǒng)屬性使用與日志現(xiàn)在我們可以試驗并更換不同的日志實現(xiàn),但你的程序代碼可以保持不變。我們要做的是用另一個流行的日志實現(xiàn)來替換掉,比如。又一次,我們必須對我們選的每一個日志實現(xiàn)做配置。 使用slf4j庫作為你的Java應(yīng)用日志API層有很多好處,這里我會展示一小部分關(guān)于如何使用和配置它的例子。 你可以把slf4j想成一個Java的接口,然后你需要實...
摘要:但是考慮到各不相同,所以出現(xiàn)了等日志框架。日志框架只是統(tǒng)一的,其底層的具體的日志記錄工作還是由等承擔。如何選擇和搭配日志系統(tǒng)目前來說,新應(yīng)用使用是首選,一些老系統(tǒng)中很可能使用的是等。所以若日志沖突時,使用的三方庫只需要相應(yīng)的實現(xiàn)庫即可。 日志系統(tǒng)的發(fā)展 我們?nèi)粘=佑|到的日志系統(tǒng)有很多種,log4j,JUL(jdk自帶),logback等,我們可以直接根據(jù)對象的日志API進行使用。但是考...
摘要:日志名的從開始,自動遞增就是指拋出的異常,是顯示全部,如果在中寫入數(shù)字,則表示展示多少行重點來了,上邊都是輸出源。 一、簡介 LogBack是一個日志框架,它是Log4j作者Ceki的又一個日志組件。 LogBack,Slf4j,Log4j之間的關(guān)系 slf4j是The Simple Logging Facade for Java的簡稱,是一個簡單日志門面抽象框架,它本身只提供了日志F...
摘要:的橋接器這個橋接器將所有日志委派給的原生實現(xiàn),直接實現(xiàn)了的接口,因此使用與的搭配也暗示了嚴格的零內(nèi)存計算溢出未完待補充 起手式 忘了什么時候聽老師說過,牛逼的公司只管定義接口,屌絲廠商實現(xiàn)接口,類似 JDBC 的實現(xiàn)便是如此,用在 slf4j, 總覺得有些類似,本來 SUN 有機會在需求產(chǎn)生之前設(shè)計一套漂亮的日志框架來一統(tǒng)天下,可惜偏偏要拖到 JDK1.4, 而這套原生的日志框架也沒有...
摘要:近期啟動時,看到如下輸出信息并伴隨嚴重錯誤警告打開的日志記錄,看到的錯誤信息如下唉呀媽呀腦瓜疼,腦瓜疼啊腦瓜疼于是在掙扎了一天之后,頭發(fā)都撓沒了,終于找到一個靠譜的解決方案,不得不感謝百度的強大這就是包沖突了啊啊啊啊啊 近期啟動tomcat時,看到如下輸出信息:SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found...
閱讀 1148·2021-09-22 15:43
閱讀 2345·2021-09-22 15:32
閱讀 4455·2021-09-22 15:11
閱讀 2188·2019-08-30 15:55
閱讀 2564·2019-08-30 15:54
閱讀 984·2019-08-30 15:44
閱讀 1095·2019-08-29 13:26
閱讀 794·2019-08-29 12:54