使用Aop实现日志记录

一 了解Aop的概念

1.连接点

在目标类中能够插入切面的一个点。

2.切点

一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点范围。
  切点其实是定义了需要在哪些连接点上执行通知。

3.通知

  切面的工作被称为通知,通知定义了切面是什么以及何时使用。
    降低了描述切面要完成的工作,通知还姐姐了何时执行这个而工作的问题,5种通知类型。

4.切面

切面是通知和切点的结合,通知和切点共同定义了切面的全部内容。定义是什么,在何时和何处完成其功能。

二 案例

2.1 连接点

将其应用至所有需要加上 日志记录 的模块对应的Controller的操作方法上!!

2.2 切面,切点,通知

//保存日志
    private void saveLog(ProceedingJoinPoint point,Long time){
        MethodSignature signature= (MethodSignature) point.getSignature();
        Method method=signature.getMethod();

        SysLogEntity logEntity=new SysLogEntity();

        //获取请求操作的描述信息
        LogAnnotation logAnnotation=method.getAnnotation(LogAnnotation.class);
        if (logAnnotation!=null){
            logEntity.setOperation(logAnnotation.value());
        }

        //获取操作方法名
        String className=point.getTarget().getClass().getName();
        String methodName=signature.getName();
        logEntity.setMethod(new StringBuilder(className).append(".").append(methodName).append("()").toString());

        //获取请求参数
        Object[] args=point.getArgs();
        String params=new Gson().toJson(args[0]);
        logEntity.setParams(params);

        //获取ip
        logEntity.setIp(IPUtil.getIpAddr(HttpContextUtils.getHttpServletRequest()));

        //获取剩下的参数
        logEntity.setCreateDate(DateTime.now().toDate());
        String userName=ShiroUtil.getUserEntity().getUsername();
        logEntity.setUsername(userName);

        //执行时间
        logEntity.setTime(time);
        sysLogService.save(logEntity);
    }
}

2.3 注解

package com.debug.pmp.server.annotation;

import java.lang.annotation.*;

/**
 * Created by Administrator on 2019/8/5.
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {

    String value() default "";

}

 

三 日志管理

3.1 查询列表

//保存日志
    private void saveLog(ProceedingJoinPoint point,Long time){
        MethodSignature signature= (MethodSignature) point.getSignature();
        Method method=signature.getMethod();

        SysLogEntity logEntity=new SysLogEntity();

        //获取请求操作的描述信息
        LogAnnotation logAnnotation=method.getAnnotation(LogAnnotation.class);
        if (logAnnotation!=null){
            logEntity.setOperation(logAnnotation.value());
        }

        //获取操作方法名
        String className=point.getTarget().getClass().getName();
        String methodName=signature.getName();
        logEntity.setMethod(new StringBuilder(className).append(".").append(methodName).append("()").toString());

        //获取请求参数
        Object[] args=point.getArgs();
        String params=new Gson().toJson(args[0]);
        logEntity.setParams(params);

        //获取ip
        logEntity.setIp(IPUtil.getIpAddr(HttpContextUtils.getHttpServletRequest()));

        //获取剩下的参数
        logEntity.setCreateDate(DateTime.now().toDate());
        String userName=ShiroUtil.getUserEntity().getUsername();
        logEntity.setUsername(userName);

        //执行时间
        logEntity.setTime(time);
        sysLogService.save(logEntity);
    }
}

3.2 清除日志

	//清除
	@ResponseBody
	@RequestMapping("/truncate")
	@RequiresPermissions("sys:log:truncate")
	public BaseResponse truncate(){
		BaseResponse response=new BaseResponse(StatusCode.Success);
		try {
			sysLogService.truncate();

		}catch (Exception e){
			response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
		}
		return response;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值