关于AOP记录日志的做法
2017-06-29 11:30
711 查看
记录日志类
拦截器类
xml配置信息:
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" />
相关文章推荐
- springboot aop 自定义注解方式实现一套完善的日志记录(完整源码)
- 通过自定义注解利用AOP在springmvc中实现记录日志
- springMVC +Mybatis +spring aop 实现用户系统操作日志记录
- JavaScript创建日志文件并记录时间的做法
- 利用特性功能实现简易的AOP日志记录功能
- spring aop 实现操作日志记录
- SpringBoot AOP 记录WEB请求日志
- spring aop记录日志
- 关于mysql中表更新二进制日志文件与information_schema记录的几点发现
- Spring AOP自定义注解实现系统日志记录管理
- 使用Spring AOP记录Controller层操作日志
- 【HAVENT原创】使用 Spring Boot 的 AOP 全局记录执行时间日志
- java使用动态代理来实现AOP(日志记录)的实例代码
- 利用Annotation和Aop实现日志记录
- 采用Spring AOP实现日志记录
- SpringMVC利用AOP实现自定义注解记录日志
- 关于PHP错误日志不记录的问题
- 关于log4j2 RollingRandomAccessFile记录日志问题
- 来一手 AOP 注解方式进行日志记录
- SpringBoot 学习记录(五): aop记录日志