关于AOP记录日志的做法

来源:互联网 发布:linux gcc rpm安装包 编辑:程序博客网 时间:2024/06/10 01:04

记录日志类

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@Componentpublic 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" />
原创粉丝点击