问题
旧服务迁移至dubbo服务,后发布请求错误后,日志未输出,只能在网关服务查看日志,定位问题需要跨服务。
若是出现某些服务内进程,如job异常,则无法定位问题(当然不包括系统够健硕,在可能出现的位置捕获了异常情况)。
定位
查看启动日志,发现日志提示
log4j:WARN No appenders could be found for logger (com.alibaba.dubbo.common.logger.LoggerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
解决方案
查看dubbo文档,可知默认是log4j框架,而logback 使用的是slf4j框架。
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());
}
}
}
}
}
方案一:
在配置文件中指定dubbo 的 logger 框架。
若已依赖,则查看是否存在jar包冲突。
dubbo:
application:
logger: slf4j
方案二:
pom添加依赖包:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
总结
个人偏向使用方案一处理,亲测依赖jar冲突,也可以使用方案一解决。