日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何开启Dubbo框架内部的日志?

發布時間:2025/6/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何开启Dubbo框架内部的日志? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

歡迎加入DUBBO交流群:259566260

這里將對如何在自己的項目里面開啟dubbo框架自己的日志,并對輸出的日志進行控制。在講這些之前,先看看dubbo在處理日志的時候是怎么做的? ?

在dubbo框架內所有的日志輸出都是通過 LoggerFactory這個靜態工廠類來獲得Logger的對象實體,并且抽離了一個LoggerAdapter用于對接第三方日志框架,所以就有了JDKLoggerAdapter,Log4jLoggerAdapter,SLF4JLoggerAdapter等一些實現子類,分別對接了不同Log第三方實現。既然dubbo能夠支持這么多log實現,那么這些實現在dubbo中優先級是在呢么樣的呢?這里的優先級是只未配置指定的logger提供方的情況下,由dubbo框架自己選擇。優先級如下: ?
?

第三方日志框架 優先級
Log4j 最高(默認就用這個)
SLF4J 次高(上面沒有采用這個)
Common Logging(jcl就是common logging) 次低(Log4j和SLF4J在項目中均沒有就用這個)
JDK log 最低(最后的選擇)

上面說的有和沒有是指你的項目classpath下面有沒有對應的jar包,如果有則表示支持對應的日志實現。下面粘貼出Dubbo選擇日志提供方的代碼:

// 查找常用的日志框架static {String logger = System.getProperty("dubbo.application.logger");if ("slf4j".equals(logger)) {setLoggerAdapter(new Slf4jLoggerAdapter());} else if ("jcl".equals(logger)) {setLoggerAdapter(new JclLoggerAdapter());} else if ("log4j".equals(logger)) {setLoggerAdapter(new Log4jLoggerAdapter());} else if ("jdk".equals(logger)) {setLoggerAdapter(new JdkLoggerAdapter());} else {try {setLoggerAdapter(new Log4jLoggerAdapter());} catch (Throwable e1) {try {setLoggerAdapter(new Slf4jLoggerAdapter());} catch (Throwable e2) {try {setLoggerAdapter(new JclLoggerAdapter());} catch (Throwable e3) {setLoggerAdapter(new JdkLoggerAdapter());}}}}}



? 上面這段靜態塊是在LoggerFactory里面,說明只要LoggerFactory類一加載就會去選擇對應的日志提供方。大家可能會發現對日志的提供方其實是可以通過配置來指定的,因為靜態塊一開始是從當前jvm環境中獲取dubbo.application.logger,這個參數是同java -Ddubbo.application.logger=xxxx去指定的,如果是放在容器里面,就需要配置在容器啟動的jvm參數里面。上面介紹了dubbo中日志相關的實現。下面講講在項目總怎么來讓dubbo能夠在項目里面輸出日志。 ?
一、你項目當前使用的是Log4j來提供日志輸出 ?
恭喜你,你不用做過多的處理就可以開啟dubbo的日志,因為dubbo默認就是使用log4j。你唯一需要做的就是配置一個name是"com.alibaba.dubbo"的logger就可以了,然后關聯到對應的appender。如下: ?

<appender name="dubboAppender" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="E:/dubbo.log" /> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern"value="[%d{MMdd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n" /> </layout> </appender> <logger name="com.alibaba.dubbo" additivity="false"> <priority value ="info"/> <appender-ref ref="dubboAppender" /> </logger>



二、你的項目當前使用的是非Log4j來提供日志輸出 這種情況,默認是看不到dubbo的日志輸出的,除非出現異常,被你當前系統的日志框架攔截住了。我這里就拿當前使用最多的日志框架logback來做示例。我們知道logback天生和slf4j進行了集成,所以要在項目里面使用logback,調用slf4j暴露的接口就可以。所以要把dubbo的日志輸出切換到logback,也就變成了切換到slf4j了。一下列舉出幾種情況來切換。 ?
1)通過設置jvm啟動參數來指定slf4j ?
這個方式最簡單,但是也很粗暴,因為你需要在jvm啟動參數上動手腳,這樣導致對于項目部署來說不是方便。 ?
2)當前項目只依賴slf4j和logback的包,并沒有依賴log4j的包 ?
這個就需要嚴格確定,不能存在log4j的相關接口的包,這個排查起來可能比較痛苦。如果使用maven那就更痛苦了,因為你可能會間接的依賴log4j的包,更可惡的就是有些jar包把log4j的接口直接打到它自己的包里面,這種“捆綁銷售”讓我們很為難。如果排查清楚了,確定沒有log4j,那么這是最好了。 ?
3)編程方式來指定slf4j ?
這種方式貌似比第一種更粗暴,但是如果遇到了那種"捆綁銷售"的現象,我們還能怎么辦呢?這里的編程方式是怎么來實現的呢?我們從上面知道dubbo在選擇日志提供方的時候是在static塊里面,那么就說明是在加載LoggerFactory的時候去選擇的。首先他是會檢查jvm環境中是否配置了"dubbo.application.logger"參數,如果配置了則使用指定的日志提供方。那么這里的切入點就是要在加載LoggerFactory之前往jvm里面設置"dubbo.application.logger"參數,雖然這種方式和第一種類似,但是這種方式對于應用來說更加的靈活。要在加載LoggerFactory之前植入這個參數,就需要知道什么時候加載LoggerFactory這個類的,既然LoggerFactory是dubbo里面的,那就是啟動dubbo框架之前設置肯定可以。由于大部分場景都是dubbo+spring的方式,所以這里就通過spring來做這件事情吧。我做了下面一件事情: ?

public class CustomContextLoaderListener extends ContextLoaderListener {static{//設置dubbo使用slf4j來記錄日志System.setProperty("dubbo.application.logger","slf4j");} }



<listener><listener-class> com.xxx.xxx.CustomContextLoaderListener</listener-class> </listener>



我寫了一個spring的ContextLoaderListener,里面只有一個靜態塊,設置"dubbo.application.logger"參數。由于dubbo+spring模式,dubbo框架是由spring框架來觸發初始化的,所以在這里做手腳在適合不過了。那么這樣我就可以通過編程的方式來配置輸出日志的提供方了。 ?
下面貼出logback的日志配置: ?

<?xml version="1.0" encoding="UTF-8" ?> <configuration><substitutionProperty name="LOG_HOME_DUBBO" value="C:/wls/dubbo"/><timestamp key="byDate" datePattern="yyyyMMdd"/><!-- dubbo log --><appender name="dubboRolling" class="ch.qos.logback.core.rolling.RollingFileAppender"><Encoding>UTF-8</Encoding><file>${LOG_HOME_DUBBO}/MTP-DUBBO.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME_DUBBO}/DEMO-%d{yyyy-MM-dd}.%i-DUBBO.zip</fileNamePattern><maxHistory>30</maxHistory><TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><MaxFileSize>100MB</MaxFileSize></TimeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern><immediateFlush>true</immediateFlush></encoder></appender><logger name="com.alibaba.dubbo" level="DEBUG"><appender-ref ref="dubboRolling"/></logger> </configuration>



對與使用其他日志提供方的,也可以采取logback方式類似的途徑來達到效果。【想知道更多dubbo內容點這里 ?

轉載于:https://my.oschina.net/bieber/blog/391530

總結

以上是生活随笔為你收集整理的如何开启Dubbo框架内部的日志?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。