关于AOP记录日志的做法

记录日志类

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" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值