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(), "通知失败"); }