最新消息:

消失的order-query的DC日志 & DC日志的原理

Arthas niuge678 612浏览 0评论

问题

在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日志的原理

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址