自定义一个注释类型类:
SystemLog.java:
使用注解切面AOP,将操作入库
LogAspect.java:
在service实现类上应用,加上自定义注解@SystemLog(desc = ""):
例如:
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(), "通知失败");
}