如何开启Dubbo框架内部的日志?
生活随笔
收集整理的這篇文章主要介紹了
如何开启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());}}}}}
一、你項目當前使用的是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>
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");} }
下面貼出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>
轉載于:https://my.oschina.net/bieber/blog/391530
總結
以上是生活随笔為你收集整理的如何开启Dubbo框架内部的日志?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebService 用户名密码验证
- 下一篇: Linux下tmpfs介绍及使用