本文共 3540 字,大约阅读时间需要 11 分钟。
@Activatepublic 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" />
转载地址:http://jhsvi.baihongyu.com/