package com.biz.core.armslog;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerAdapter;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.alibaba.dubbo.common.logger.jcl.JclLoggerAdapter;
import com.alibaba.dubbo.common.logger.jdk.JdkLoggerAdapter;
import com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter;
import com.alibaba.dubbo.common.logger.slf4j.Slf4jLoggerAdapter;
import com.alibaba.dubbo.common.utils.ConfigUtils;
import com.alibaba.dubbo.rpc.*;
import com.alibaba.dubbo.rpc.filter.ExceptionFilter;
import com.alibaba.dubbo.rpc.service.GenericService;
import com.alibaba.fastjson.JSON;
import java.io.Serializable;
/**
* @author liqiang
* @date 2020/4/2 14:23
* @Description: (what)通过dubboSPI机制对Filter进行代理在原有功能的基础上做增强(打印错误入参) 需要移除默认的exceptionFilter
* <dubbo:provider filter="-exception,exceptionFilterProxy" />
* (why) 增强provider异常过滤器 打印异常入参
*/
@Activate(
group = {"provider"}//限制provider可用
)
public class ExceptionFilterProxy implements Filter {
private final Logger logger;
Filter filter;
public ExceptionFilterProxy() {
this.logger = LoggerFactory.getLogger(ExceptionFilterProxy.class);
//静态代理ExceptionFilter
this.filter = new ExceptionFilter();
}
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
Result result = filter.invoke(invoker, invocation);
//对ExceptionFilter做功能增强 当出现异常打印入参
if (filter instanceof ExceptionFilter) {
outputLog(result, invoker, invocation);
}
return result;
}
public void outputLog(Result result, Invoker<?> invoker, Invocation invocation) {
try {
if (result.hasException() && GenericService.class != invoker.getInterface()) {
Throwable exception = result.getException();
if (exception instanceof RuntimeException) {
logger.error(buildLog(invocation.getParameterTypes(), invocation.getArguments()));
}
}
} catch (Exception e) {
logger.error("打印异常入参出错", e);
}
}
private String buildLog(Class<?>[] parametersTypes, Object[] parameterValues) {
if (parametersTypes == null || parametersTypes.length <= 0) {
return null;
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("入参:\n");
for (int i = 0; i < parametersTypes.length; i++) {
Class<?> type = parametersTypes[i];
Object value = parameterValues[i];
if (Serializable.class.isAssignableFrom(type)) {
stringBuilder.append(String.format("参数类型:%s,参数值:%s\n", type.toString(), value != null ? JSON.toJSONString(value) : null));
} else {
stringBuilder.append(String.format("参数类型:%s,参数值:%s\n", type.toString(), value != null ? value.toString() : null));
}
}
return stringBuilder.toString();
}
static {
String logger = "slf4j";
if ("slf4j".equals(logger)) {
LoggerFactory.setLoggerAdapter((LoggerAdapter) (new Slf4jLoggerAdapter()));
} else if ("jcl".equals(logger)) {
LoggerFactory.setLoggerAdapter((LoggerAdapter) (new JclLoggerAdapter()));
} else if ("log4j".equals(logger)) {
LoggerFactory.setLoggerAdapter((LoggerAdapter) (new Log4jLoggerAdapter()));
} else if ("jdk".equals(logger)) {
LoggerFactory.setLoggerAdapter((LoggerAdapter) (new JdkLoggerAdapter()));
} else {
try {
LoggerFactory.setLoggerAdapter((LoggerAdapter) (new Log4jLoggerAdapter()));
} catch (Throwable var6) {
try {
LoggerFactory.setLoggerAdapter((LoggerAdapter) (new Slf4jLoggerAdapter()));
} catch (Throwable var5) {
try {
LoggerFactory.setLoggerAdapter((LoggerAdapter) (new JclLoggerAdapter()));
} catch (Throwable var4) {
LoggerFactory.setLoggerAdapter((LoggerAdapter) (new JdkLoggerAdapter()));
}
}
}
}
}
}