根据需要添加日志的方法配置方法名称
logMethod.properties
#公共日志方法配置
#key :接口方法名和入参对象 value :方法对应的模块值
createOrder_OrderInfo=4
#申请退款
applyForRefund_OrderReturnRequest=4
加载配置文件类:
public class LogMethodConstants {
private final static Logger logger = LoggerFactory.getLogger(LogMethodConstants.class);
public final static List<String> methods =Lists.newArrayList();
public final static Map<String,String> map=Maps.newHashMap();
static{
Properties pro = new Properties();
try {
pro.load(LogMethodConstants.class.getResourceAsStream("/props/logMethod.properties"));
Set<Entry<Object,Object>> entrySet = pro.entrySet();
for (Entry<Object, Object> entry : entrySet) {
methods.add(entry.getKey().toString().split("_")[0]);
map.put(entry.getKey().toString().split("_")[0], entry.getValue().toString());
methodEntrys.put(entry.getKey().toString().split("_")[0], entry.getKey().toString().split("_")[1]);
}
} catch (IOException e) {
logger.info("LogMethodConstants 异常:{}",e);
}
}
}
日志切面类:
@Component
@Aspect
public class CommonLogAspect {
private final static Logger logger = LoggerFactory.getLogger(CommonLogAspect.class);
@Resource(name="fmqLogProducer")
private MqProducer producer;
List<String> methods = LogMethodConstants.methods;
Map<String,String> map = LogMethodConstants.map;
private String beforeParam ="";
@Value("${app.name}")
private String appName;
/**
* 定义一个切点public * com.jd.crowdfunding.mall.miste.service..*.*(..)
*
*/
@Pointcut("execution(public * com.jd.crowdfunding.mall.order.*.*.*(..))")
public void pointcut(){}
// value = "pointcut() &&"+ "args(request,..)"
@Before(value = "pointcut()")
public void saveLogBefore(JoinPoint point){
logger.info("===============before====================");
String methodName = point.getSignature().getName();
if(methods.contains(methodName)){
Object[] args = point.getArgs();
logger.info("进入before:{}",JSON.toJSONString(args));
beforeParam = JSON.toJSONString(args);
}
}
//value="pointcut() &&"+ "args(request,..)"
@After(value="pointcut()")
public void saveLogAfter(JoinPoint point){
logger.info("================after===================");
String methodName = point.getSignature().getName();
String className = point.getTarget().getClass().getName();
if(methods.contains(methodName)){
Object[] args = point.getArgs();
String afterParam = JSON.toJSONString(args);
logger.info("进入after:{}",JSON.toJSONString(args));
Integer code = Integer.valueOf(map.get(methodName));
saveLog(code,beforeParam,afterParam,methodName,className);
}
}
public void saveLog(Integer code,Object beforeParam,Object afterParam,String methodName,String className){
try {
// HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
/** 保存日志,发送MQ */
CallerInfo callerInfo = new CallerInfo(LogSystem.CF_MALL.getCode(),appName,code,dataId,beforeParam.toString(),afterParam.toString(),IP,className,methodName);
callerInfo.setOperationPin(operationPin);
logger.info("保存日志,发送MQ入参:{}",JSON.toJSONString(callerInfo));
producer.process(callerInfo);
} catch (Exception e) {
logger.info("保存日志,发送MQ异常",e);
}
}
}
这里我们采用异步发送MQ的形式记录日志,也可以调用JSF接口形式,根据不同的项目按照实际情况操作。