@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" />