欢迎加入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());
}
}
}
}
}
<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>
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框架来触发初始化的,所以在这里做手脚在适合不过了。那么这样我就可以通过编程的方式来配置输出日志的提供方了。 <?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>原文:http://blog.csdn.net/jdream314/article/details/44620767