AOP操作日志

java代码

package com.nusp.Config;
import com.nusp.Entity.Common.JobOperationLog;
import com.nusp.Service.Common.CommonServer;
import com.nusp.Utils.IdUtils;
import io.swagger.annotations.ApiOperation;
import org.apache.log4j.Logger;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.Enumeration;

/**
 * Web层日志切面
 */
@Aspect    //这里使用@Aspect注解方式设置AOP
@Order(5)  //值越小,越先加载
@Component
public class WebLogAspect {
    @Autowired
    CommonServer commonServer;

    private Logger logger = Logger.getLogger(getClass());

    ThreadLocal<Long> startTime = new ThreadLocal<>();

    //这里@Pointcut设置切点可以设置为Controller层的地址
    @Pointcut("execution( * com.nusp.Controller.*.*.*(..))")
    public void webLog() {
    }

    //@Before指在切点方法之前执行,也就是在Controller层方法执行之前执行,这里可以通过JoinPoint获取一些有关方法的信息,在这里也可以修改参数的值

    //@Before()括号里设置的是切点方法的名称
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //操作日志对象
        JobOperationLog log = new JobOperationLog();
        //通过反射获取到类,填入类名
        Class cl1 = Class.forName(joinPoint.getSignature().getDeclaringTypeName());
        Method[] methods = cl1.getMethods();
//       //获取ApiOperation注解
        for(Method method:methods)
        {
            //joinPoint.getSignature().getName()方法名
            if(method.getName().equals(joinPoint.getSignature().getName()))
            {
                ApiOperation anno = method.getAnnotation(ApiOperation.class);
                if (anno != null) {
                    log.setMethodName(anno.value());
                }
            }}
        log.setId(IdUtils.createUuid());
        log.setUrl(request.getRequestURL().toString());
        log.setIp(request.getRemoteAddr());
        log.setHttpMethod(request.getMethod());
        log.setUserId(12313);
        log.setCreateTime(new Date());
        log.setClassMethod(joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        commonServer.savelog(log);
    }
}

实体

package com.nusp.Entity.Common;
import lombok.Data;
import java.util.Date;


@Data
public class JobOperationLog {
    private String id;
    private String methodName;
    private String url;
    private String ip;
    private String httpMethod;
    private Integer userId;
    private Date createTime;
    private String classMethod;
}

依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>

sql

        INSERT INTO
        job_operation_log
            (
                id,
                url,
                http_method,
                ip,
                class_method,
                create_time,
                user_id,
                method_name
            )
        VALUES
            (
                #{id},
                #{url},
                #{httpMethod},
                #{ip},
                #{classMethod},
                #{createTime},
                #{userId},
                #{methodName}
            )

建表语句

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 100506
 Source Host           : localhost:3306
 Source Schema         : archives

 Target Server Type    : MySQL
 Target Server Version : 100506
 File Encoding         : 65001

 Date: 09/09/2022 14:17:32
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for job_operation_log
-- ----------------------------
DROP TABLE IF EXISTS `job_operation_log`;
CREATE TABLE `job_operation_log`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求接口地址',
  `http_method` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方式',
  `ip` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'ip地址',
  `class_method` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'class方法',
  `create_time` datetime(0) NULL DEFAULT NULL,
  `user_id` int(11) NULL DEFAULT NULL COMMENT '用户id',
  `method_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '方法说明',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 97 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '操作日志' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

完结撒花

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要定义一个注解来标识需要记录操作日志的方法: ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Loggable { String value() default ""; } ``` 然后,定义一个切面类来实现记录操作日志的功能: ```java @Aspect @Component public class LoggingAspect { @Autowired private LogService logService; @Around("@annotation(loggable)") public Object logMethodExecution(ProceedingJoinPoint joinPoint, Loggable loggable) throws Throwable { String methodName = joinPoint.getSignature().getName(); String className = joinPoint.getTarget().getClass().getSimpleName(); String message = loggable.value().isEmpty() ? methodName : loggable.value(); Object[] args = joinPoint.getArgs(); String argString = Arrays.toString(args); Object result = null; try { result = joinPoint.proceed(); logService.log(className, methodName, message, argString, result.toString(), LogType.INFO); } catch (Exception e) { logService.log(className, methodName, message, argString, e.getMessage(), LogType.ERROR); throw e; } return result; } } ``` 在切面类中,我们使用@Around注解来标识切面类型为Around,同时使用@annotation(loggable)来指定需要拦截的方法必须被@Loggable注解修饰。在切面方法中,我们可以获取到目标方法的类名、方法名、参数列表以及返回值,并把这些信息记录到数据库中。 最后,我们需要定义一个LogService类来实现将操作日志记录到数据库的功能。具体实现可以根据项目的具体情况而定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值