Aop切面记录日志

运用Aop的特性对访问接口的进行记录打印输出,分别记录用户的名称,访问功能,请求参数,请求Url,请求IP,请求结果,返回参数

package com.vimochina.vimo.config;

import cn.hutool.json.JSONUtil;
import eu.bitwalker.useragentutils.UserAgent;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.vimochina.vimo.basic.dao.SysUserDao;
import com.vimochina.vimo.basic.entity.SysMenu;
import com.vimochina.vimo.basic.entity.SysSaveLog;
import com.vimochina.vimo.basic.entity.SysUser;
import com.vimochina.vimo.basic.service.SysMenuService;
import com.vimochina.vimo.basic.service.SysSaveLogService;
import com.vimochina.vimo.basic.service.SysUserService;
import com.vimochina.vimo.jjwt.JwtHelper;
import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Objects;

/**
 * <p>
 * 使用 aop 切面记录请求日志信息
 * </p>
 *
 * @package: com.xkcoding.log.aop.aspectj
 * @description: 使用 aop 切面记录请求日志信息
 * @author: yangkai.shen
 * @date: Created in 2018/10/1 10:05 PM
 * @copyright: Copyright (c) 2018
 * @version: V1.0
 * @modified: yangkai.shen
 */
@Aspect
@Component
@Slf4j
public class AopLog {
	@Autowired
	private SysMenuService sysMenuService;
	@Autowired
	private SysUserService sysUserService;
	@Autowired
	private SysUserDao sysUserDao;
	@Autowired
	private SysSaveLogService sysSaveLogService;
	private static final String START_TIME = "request-start";

    /**
     * 切入点
     */
    @Pointcut("execution(public * com.vimochina.vimo.tower.controller.*Controller.*(..))")
    public void log() {

    }

    /**
     * 前置操作
     *
     * @param point 切入点
     * @throws ParseException 
     */
    @Before("log()")
    public void beforeLog(JoinPoint point) throws ParseException {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
        Long start = System.currentTimeMillis();
        request.setAttribute(START_TIME, start);
        
    }

    /**
     * 环绕操作
     *
     * @param point 切入点
     * @return 原方法返回值
     * @throws Throwable 异常信息
     */
    @Around("log()")
    public Object aroundLog(ProceedingJoinPoint point) throws Throwable {
    	ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
        String name = point.getSignature().getName();
        String userName = "test";
        String menuName = "test";
        String openId = "test";
        String loginFlag = "1";
        String delFlag = "0";
        Integer deptId = 0;
        Map<String, String[]> parameterMap = request.getParameterMap();
        if("login".equals(name)) {
        	loginFlag = "0";
            if(parameterMap!=null) {
            	String[] strings = parameterMap.get("loginName");
            	if(strings!=null) {
            		openId = strings[0];
            		SysUser searchByUserName = this.sysUserService.searchByUserName(openId);
                     if(searchByUserName!=null) {
                    	 userName = searchByUserName.getUserName();
                    	 deptId = searchByUserName.getDeptId();
                    	 SysMenu searchByUrl = this.sysMenuService.searchByUrl(request.getRequestURI());
                    	 if(searchByUrl!=null) {
                    		 menuName = searchByUrl.getMenuName();
                    	 }
                     }
            	}   
            }
        }else {
        	//String token = request.getHeader("authorization");
        	String token = "eyJhbGciOiJIUzI1NiJ9.eyJvcGVuSWQiOiJhZG1pbiIsInVzZXJJZCI6ImFkbWluIiwiaWF0IjoxNTc1OTQ5NzY5LCJqdGkiOiJ0b2tlbklkIn0.KrwICjqrQ027sSNrSahMihrRh2aWTaY68ojfqNCPuCM";
        	Claims claims = JwtHelper.verifyJwt(token);
        	openId = claims.get("openId").toString();                    
        	if(parameterMap!=null) {
        		SysUser searchByUserName = this.sysUserDao.searchByUserName(openId);
        		if(searchByUserName!=null) {
        			userName = searchByUserName.getUserName();
        			deptId = searchByUserName.getDeptId();
        			SysMenu searchByUrl = this.sysMenuService.searchByUrl(request.getRequestURI());
        			if(searchByUrl!=null) {
        				menuName = searchByUrl.getMenuName();
        			}
        		}  
        	}
        }
        
        //设置日期格式
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // new Date()为获取当前系统时间
        String format = sdf1.format(new Date());
        SimpleDateFormat sdf2= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = sdf2.parse(format);
        String header = request.getHeader("User-Agent");
        UserAgent userAgent = UserAgent.parseUserAgentString(header);        
        String ip = request.getRemoteAddr();
        String url = request.getRequestURL().toString();
        String brower = userAgent.getBrowser().toString();
        String os = userAgent.getOperatingSystem().toString();
        JSONObject result = (JSONObject)point.proceed();
        String msg =null;
        if(result!=null) {
        	Integer return_code = (Integer)result.get("return_code");
        	if(return_code==1) {
        		msg = result.get("return_msg").toString();
        	}else if(return_code==0) {
        		msg = result.get("return_msg").toString();
        	}else if(return_code==2) {
        		msg = result.get("return_msg").toString();
        	}       	
        }

        log.info("【用户名称】:{}", userName);
        log.info("【访问功能】:{}", menuName);
        log.info("【请求参数】:{},", JSONUtil.toJsonStr(parameterMap));
        log.info("【请求 URL】:{}", url);
        log.info("【请求 IP】:{}", ip);
        log.info("【请求结果】:{}", msg);
        log.info("【返回值】:{}", JSONUtil.toJsonStr(result));
        //log.info("【请求 用户】:{}", request.getHeader("authorization"));
        //log.info("【请求类名】:{},【请求方法名】:{}", point.getSignature().getDeclaringTypeName(), point.getSignature().getName());
        SysSaveLog sysSaveLog = new SysSaveLog();
        sysSaveLog.setUserName(userName);
        sysSaveLog.setUserAccount(openId);
        sysSaveLog.setRequestTime(date);
        sysSaveLog.setIp(ip);
        sysSaveLog.setUrl(url);
        sysSaveLog.setAccessFunction(menuName);
        sysSaveLog.setLoginFlag(loginFlag);
        sysSaveLog.setDeptId(deptId);
        sysSaveLog.setDelFlag(delFlag);
        sysSaveLog.setOs(os);
        sysSaveLog.setBrowser(brower);
        sysSaveLog.setMsg(msg);
        int save = this.sysSaveLogService.save(sysSaveLog);
        if(save==0) {
        	System.out.println("日志插入成功");
        }else {
        	System.out.println("日志插入失败");
        }
        
        return result;
    }

    /**
     * 后置操作
     */
    @AfterReturning("log()")
    public void afterReturning() {
    	ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();

        Long start = (Long) request.getAttribute(START_TIME);
        Long end = System.currentTimeMillis();
        log.info("【请求耗时】:{}毫秒", end - start);
        
        String header = request.getHeader("User-Agent");
        UserAgent userAgent = UserAgent.parseUserAgentString(header);
        log.info("【浏览器类型】:{},【操作系统】:{},【原始User-Agent】:{}", userAgent.getBrowser().toString(), userAgent.getOperatingSystem().toString(), header);
    }
}
发布了21 篇原创文章 · 获赞 0 · 访问量 492

猜你喜欢

转载自blog.csdn.net/mws666/article/details/103879255