问题
在IPL期间,返现order-query服务没有DC日志,同时代码也没有@DCFilter的注解。本文记录一下问题的根源。
处理过程
我首先全局搜索了order-query代码中有没有@DCFilter标签,结果是没有。
我继续搜索了domain包(数据库相关代码的包),怀疑是父项目中添加了这样的标签,结果也是没有。这里反思一下,其实搜索domain包是错的,应该搜索base包。domain里面只是一些数据库的操作,跟Controller,或者日志处理完全没有关系。
最后,还是问了小龙才了解到根本原因。在base项目里(跟domain不同,domain处理数据库,base处理filter,interceptor,metrics,prometheus,health等common或者generic的内容)定义了RestInterceptor:
@Pointcut("@target(org.springframework.web.bind.annotation.RestController) && within(com.alibet.fantasy..rest.*)")
public void pointcut() {
}
在上面切面的定义中,Controller需要添加@RestController注解,并且限制了包的名字(问题就处在这里)。修改包的名字,就可以看到正确的DC日志了。
现在base包用的DC的版本是:dc-log-3.0.4-20190813.082642-66.jar
DC日志的原理
DC是如何把日志信息(IP,开始时间,结束时间,方法名,参数,返回值等信息)?其实就是把这些信息放到了ThreadLocal里保存起来。
private static ThreadLocal<MDC.MDCAdapter> adapter = ThreadLocal.withInitial(() -> {
return new MDC.MDCAdapter();
});
对于嵌套的函数调用,DC是如何处理的?每次遇到@DCFilter,都会触发一次startDC,有一个计数器adapter.count = adapter.count + 1,只有当count为1,记录函数的参数,只有当count为0,记录函数的返回值。这样就只会记录最外层的DC。
Settlement-new的DC版本
<dependency>
<groupId>com.alibet.alibetcommon</groupId>
<artifactId>dc-log</artifactId>
<version>3.0.4-SNAPSHOT</version>
</dependency>
虽然settlement-new-core里指定了dc的版本,但是好像并没有起作用。arthas反编译,看到用的是3.1.10版本:
class-info com.alibet.dc.DCFilter
code-source file:/root/fantasy-settlement-new.jar!/BOOT-INF/lib/dc-log-3.1.10.jar!/
转载请注明:牛哥678 » 消失的order-query的DC日志 & DC日志的原理