Spring AOP 注解添加操作日志

自定义一个注释类型类:
SystemLog.java:
package com.ceair.dc.log;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface SystemLog {
	String desc() default "";
}



使用注解切面AOP,将操作入库
LogAspect.java:
package com.ceair.dc.log;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.ceair.dc.log.entity.OperateLog;
import com.ceair.dc.log.service.OperateLogService;
import com.ceair.dc.system.SystemSecurityHolder;

@Aspect
@Component
public class LogAspect {
	private Log logger = LogFactory.getLog(getClass());
	@Autowired
	private OperateLogService operateLogService;
	private List<OperateLog> logList = new ArrayList<OperateLog>();
	private Object logLock = new Object();
	private static int bathCount = 20;//批量提交数量
	
	@Around("@annotation(sl)")
	public Object traceMethod(final ProceedingJoinPoint jp, SystemLog sl) throws Throwable{
		Object returnVal = null;
		try {
			Long t1 = System.currentTimeMillis();
			Object[] parames = jp.getArgs();//获取目标方法体参数
			String argument = parseParames(parames); //解析目标方法体的参数
			String className = jp.getTarget().getClass().getName();//获取目标类名
			String methodName = jp.getSignature().getName();//获取目标方法签名
			
			OperateLog log = new OperateLog();
			//log.setArgument(argument);
			log.setClassName(className);
			log.setMethodName(methodName);
			log.setMethodDesc(sl.desc());
			log.setUserId(SystemSecurityHolder.getUserId());
			log.setUserName(SystemSecurityHolder.getUserName());
			log.setIpAddress(SystemSecurityHolder.getIpAddress());
			log.setOperateTime(new Date());
			if(argument.length() > 4000) {
				log.setParams(argument.substring(0, 3999));
			} else {
				log.setParams(argument);
			}
			returnVal = jp.proceed();
			log.setCallTime(System.currentTimeMillis() - t1);
			addToLogList(log);
			
            return returnVal;
		} catch (Exception e) {
			e.printStackTrace();
			if(logger.isErrorEnabled()) {
				logger.error("记录操作日志出错" + e);
			}
		}
		return returnVal;

	}

	private void addToLogList(OperateLog log) {
		logList.add(log);
		if(logList.size() >= bathCount) {
			synchronized (logLock) {
				if(logList.size() >= bathCount) {
					List<OperateLog> commitList = logList.subList(0, bathCount);
					operateLogService.doBatchInsertLogs(commitList);
					commitList.clear();
				}
			}
		}
	}


	
	/**
	 * 解析方法参数
	 * @param parames 方法参数
	 * @return 解析后的方法参数
	 */
	private String parseParames(Object[] parames) {
		StringBuffer sb = new StringBuffer("");
		try {
			for(int i=0; i<parames.length; i++){
				if(parames[i] instanceof Object[] || parames[i] instanceof Collection){
					try{
						JSONArray json = JSONArray.fromObject(parames[i]);
						if (json != null && json.size() > 0) {
							if(i==parames.length-1){
								sb.append(json.toString());
							}else{
								sb.append(json.toString() + ",");
							}
						} else {
							if(i==parames.length-1){
								sb.append(parames[i].toString());
							}else{
								sb.append(parames[i].toString() + ",");
							}
						}
					}catch (Exception e) {
						if(i==parames.length-1){
							sb.append(parames[i].toString());
						}else{
							sb.append(parames[i].toString() + ",");
						}
					}
				}else{
					try{
						JSONObject json = JSONObject.fromObject(parames[i]);
						if (json != null && json.size() > 0) {
							if(i==parames.length-1){
								sb.append(json.toString());
							}else{
								sb.append(json.toString() + ",");
							}
						} else {
							if(i==parames.length-1){
								sb.append(parames[i].toString());
							}else{
								sb.append(parames[i].toString() + ",");
							}
						}
					}catch (Exception e) {
						if(i==parames.length-1){
							sb.append(parames[i].toString());
						}else{
							sb.append(parames[i].toString() + ",");
						}
					}
				}
			}
			String params = sb.toString();
			params = params.replaceAll("(\"\\w+\":\"\",)", "");
			params = params.replaceAll("(,\"\\w+\":\"\")", "");
			return params;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sb.toString();
	}

	
	
}



在service实现类上应用,加上自定义注解@SystemLog(desc = ""):
例如:
@Override
	@SystemLog(desc = "通知监控页面-通知")
	public OperateResult sendMessage(Map<String, Object> params) {
		// TODO Auto-generated method stub
		Flight flight = getFlight(params);
		if(flight != null){
			if((FlightStatus.INIT.name().equals(flight.getFlightStatus()))||(FlightStatus.QUEUE.name().equals(flight.getFlightStatus()))){
				flight.setNotifySource(params.get("notifySource").toString());
				return flightSendMessageService.doSendMessage(flight);
			}else{//状态已不为未通知
				logger.info("该航班状态已从未通知变为:"+flight.getFlightStatus());
				return new OperateResult(YesOrNo.NO.name(), "该航班状态已发生变化");
			}
		}
		return new OperateResult(YesOrNo.NO.name(), "通知失败");
	}

猜你喜欢

转载自chenxu-joy.iteye.com/blog/2283334