通过spring aop记录日志信息(异常)

前言

在日常开发中,我们经常需要对接接口数据,日志记录用户操作,如果单纯的使用手动记录的话不仅会让代码看起来不美观还增加了很多的工作量。但是如果使用aop切面在不影响业务情况下进行日志访问记录的话就省事多了。

代码

实体类Log.java

@Data
public class Log {
    private Integer id;
    private String username;
    private String operation;
    private String method;
    private String params;
    private String returnParams;
    private String error;
    private String ip;
    private Date createTime;
}

LogApi.java注解类

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogApi {
    String value() default "";
}

自定义aop日志切入LogAspect.java

@Aspect
@Component
public class LogAspect {
    @Autowired
    private LogMapper logMapper;
    Log sysLog = new Log();
    @Pointcut("@annotation(com.test.anonation.LogApi)")
    public void logPointCut() {
    }
    @Before("logPointCut()")
    public void saveSysLog(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        LogApi syslog = method.getAnnotation(LogApi.class);
        if(syslog != null){
            //注解上的描述
            sysLog.setOperation(syslog.value());
        }
        //请求的方法名
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = signature.getName();
        sysLog.setMethod(className + "." + methodName + "()");
        System.out.println(sysLog.getMethod());
        //请求的参数
        Object[] args = joinPoint.getArgs();
        String params = JSON.toJSONString(args);
        sysLog.setParams(params);
        HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
        sysLog.setIp(IPUtils.getIpAddr(request));
        String username ="测试而已";
        sysLog.setUsername(username);
        sysLog.setCreateTime(new Date());
        //保存系统日志
    }
    @AfterReturning(returning="rvt", pointcut="logPointCut()")
    public void AfterExec(JoinPoint joinPoint,Object rvt){
        sysLog.setReturnParams(rvt==null?"":rvt.toString());
        sysLog.setError("");
        logMapper.insert(sysLog);
        sysLog=new Log();
    }
    @AfterThrowing(pointcut = "logPointCut()",throwing="e")
    public void doException(JoinPoint jp,Throwable e){
        if(e!=null){
            Logger logger = LoggerFactory.getLogger(jp.getSignature().getClass());
            logger.error(e.getMessage(),e);
            sysLog.setError("错误:"+e);
            logMapper.insert(sysLog);
            sysLog=new Log();
        }
    }
}

工具类IPUtils.java

    public static String getIpAddr(HttpServletRequest request) {
        String ip = null;
        try {
            ip = request.getHeader("x-forwarded-for");
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
        } catch (Exception e) {
            logger.error("IPUtils ERROR ", e);
        }
        return ip;
    }

request获取工具类HttpContextUtils.java

  public static HttpServletRequest getHttpServletRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值