您的位置:首页 > 运维架构

关于AOP记录日志的做法

2017-06-29 11:30 711 查看
记录日志类

package com.suning.sdipa.aop.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.METHOD, ElementType.TYPE })
public @interface AdminLog {

/**
* 系统编码
*/
String systemType() default "SDIPA";

/**
*
* 模块编码 <br>
*/
String moduleType();

/**
* 操作类型
*/
String operType();
}


拦截器类

package com.suning.sdipa.aop.log;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.google.common.collect.Lists;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.suning.rca.dto.LogRequest;
import com.suning.rca.service.UserRCAService;
import com.suning.rsf.consumer.ServiceLocator;

@Aspect
@Component
public class AdminLogInterceptor {

private static final Logger LOGGER = LoggerFactory.getLogger("operateLog");

private static final Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();

private UserRCAService userRCAService = ServiceLocator.getService(UserRCAService.class, "userRCAService");

private final AtomicInteger threadNumber = new AtomicInteger(1);
private final ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors() + 2, new ThreadFactoryBuilder().setNameFormat(AdminLogThreadName()).setDaemon(true)
.build());

private String AdminLogThreadName() {
String name = "AdminLogThread-" + threadNumber.getAndIncrement();
return name;
}

@Pointcut("@annotation(com.suning.sdipa.aop.log.AdminLog)")
public void AdminLogAspect() {

}

@Before("AdminLogAspect()")
public void doBefore(JoinPoint joinPoint) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
final String userId = getLoginUserIdFromCookie(request);
Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
AdminLog reuqired = method.getAnnotation(AdminLog.class);
final String systemType = reuqired.systemType();
final String operType = reuqired.operType();
final String moduleType = reuqired.moduleType();
final Object[] args = joinPoint.getArgs();
executorService.submit(new Runnable() {
@Override
public void run() {
List<Object> paramList = Lists.newArrayList();
for (Object arg : args) {
if (arg instanceof HttpServletRequest || arg instanceof HttpServletResponse) {
continue;
}
paramList.add(arg);
}
Map<String, Object> json = new HashMap<String, Object>();
json.put("systemType", systemType);
json.put("userId", userId);
json.put("operType", operType);
json.put("moduleType", moduleType);
json.put("param", paramList);
LOGGER.info("AdminOperLog[" + gson.toJson(json) + "]");
LogRequest log = new LogRequest();
log.setOperatorId(userId);
log.setSystemCode(systemType);
log.setModule(moduleType);
log.setType(operType);
log.setBeforeInfo(gson.toJson(paramList));
userRCAService.operLog(log);
}
});
}

private static final String COOKIE_KEY = "loginToken";

public static String getLoginUserIdFromCookie(HttpServletRequest request) {
String loginTokenCookie = getLoginAllCookie(request);
return loginTokenCookie.split("\\|")[1];
}

private static String getLoginAllCookie(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
String loginTokenCookie = null;
if (cookies != null && cookies.length > 0) {
for (Cookie cookie : cookies) {
if (COOKIE_KEY.equals(cookie.getName())) {
loginTokenCookie = cookie.getValue();
break;
}
}
}
return loginTokenCookie;
}
}


xml配置信息:

<aop:aspectj-autoproxy proxy-target-class="true" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: