使用Aop实现日志记录

Posted 健康平安的活着

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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;
	}

 

以上是关于使用Aop实现日志记录的主要内容,如果未能解决你的问题,请参考以下文章

aop日志(记录方法调用日志)

自定义日志注解 + AOP实现记录操作日志

我使用Spring AOP实现了用户操作日志功能

Spring Boot 中使用Spring Aop实现日志记录功能

Spring AOP 实现日志记录功能

SpringAOP+注解实现简单的日志管理