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(), "通知失败");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值