dubbo 日誌ID鏈條

@Activate
public class NoticeFilterDubbo implements Filter {
    public static final Logger logger = LoggerFactory.getLogger(NoticeFilterDubbo.class);
    public static final ObjectMapper objectMapper = new ObjectMapper();

    public NoticeFilterDubbo() {
    }

    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String interfaceName = invoker.getUrl().getParameter("interface");
        String methodName = invocation.getMethodName();
        String appName = FrameProperty.get("appname");
        String aid = invocation.getAttachment("_DUBBO_AGENT_ID");
        String tid = invocation.getAttachment("_DUBBO_TRASACTION_ID");
        String sid = invocation.getAttachment("_DUBBO_SPAN_ID");
        String ssid = invocation.getAttachment("_DUBBO_STACK_START_ID");
        String tidStr = null;
        String traceId = "";
        String rpcId = "";
        if (aid != null && tid != null && sid != null && ssid != null) {
            tidStr = aid.toString() + "," + tid.toString() + "," + ssid.toString() + "," + sid.toString();
            CommonUtil.getTraceId(tidStr);
            traceId = tid.toString();
            rpcId = sid.toString();
        } else {
            traceId = CommonUtil.getTraceId(2);
        }

        String url = interfaceName + "." + methodName;
        ThreadLocalContainer.setURI(url);
        String logId = ThreadLocalContainer.getUinqueLogId();
        MDC.put("traceUrl", "traceUrl[" + CommonUtil.getTraceUrl(tidStr) + "]");
        MDC.put("traceid", "traceid[" + traceId + "]");
        MDC.put("rpcid", "rpcid[" + rpcId + "]");
        MDC.put("logid", "logid[" + logId + "]");
        MDC.put("url", "url[" + url + "]");
        TimeUtil.start(SourceTagEnum.TOTAL, "");
        RpcResult result = (RpcResult)invoker.invoke(invocation);
        TimeUtil.end(SourceTagEnum.TOTAL, "");
        if (!result.hasException()) {
            RequestContext.getLoginfo().put("resCode", "0");
            RequestContext.getLoginfo().put("resMsg", "success");
        } else {
            Throwable e = result.getException();
            MyLogs.warn("catch in as-log.NoticeFilterDubbo", e);
            RequestContext.getLoginfo().put("resCode", "1");
        }

        boolean isNoPointParam = Constants.noPointParamLogMethodMap.containsKey(methodName);
        boolean isUsingNoPointParamLog = Constants.isUsingNoPointParamLog;
        if (!isUsingNoPointParamLog || !isNoPointParam) {
            this.printRequest(invocation);
        }

        logger.notice("", appName, "", "", RequestContext.getLoginfo());
        return result;
    }

    private void printRequest(Invocation invocation) {
        Object[] objs = invocation.getArguments();

        try {
            if (objs != null) {
                if (objs.length > 1) {
                    ThreadLocalContainer.setRequestString(bean2Json(objs));
                } else if (objs.length == 1) {
                    ThreadLocalContainer.setRequestString(bean2Json(objs[0]));
                }
            }
        } catch (Exception var4) {
            ;
        }

    }

    public static String bean2Json(Object obj) {
        try {
            return obj == null ? "" : objectMapper.writeValueAsString(obj);
        } catch (Exception var2) {
            logger.warn("bean2Json error", var2);
            return "";
        }
    }
}

重點爲 MDC和ThreadLocal。

在resources目錄下添加純文本文件META-INF/dubbo/com.alibaba.dubbo.rpc.Filter,內容如下:

      notice=com.liwen.as.log.filter.NoticeFilterDubbo

<dubbo:provider  filter="exceptionFilter" threadpool="fixed" threads="500" dispatcher="message" />

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章