国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用SpringBoot AOP記錄操作日志和異常日志

這篇具有很好參考價值的文章主要介紹了使用SpringBoot AOP記錄操作日志和異常日志。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

使用SpringBoot AOP記錄操作日志和異常日志

平時我們在做項目時經常需要對一些重要功能操作記錄日志,方便以后跟蹤是誰在操作此功能;我們在操作某些功

能時也有可能會發(fā)生異常,但是每次發(fā)生異常要定位原因我們都要到服務器去查詢日志才能找到,而且也不能對發(fā)

生的異常進行統計,從而改進我們的項目,要是能做個功能專門來記錄操作日志和異常日志那就好了。

當然我們肯定有方法來做這件事情,而且也不會很難,我們可以在需要的方法中增加記錄日志的代碼,和在每個方

法中增加記錄異常的代碼,最終把記錄的日志存到數據庫中。聽起來好像很容易,但是我們做起來會發(fā)現,做這項

工作很繁瑣,而且都是在做一些重復性工作,還增加大量冗余代碼,這種方式記錄日志肯定是不可行的。

我們以前學過Spring 三大特性,IOC(控制反轉),DI(依賴注入),AOP(面向切面),那其中AOP的主要功能

就是將日志記錄,性能統計,安全控制,事務處理,異常處理等代碼從業(yè)務邏輯代碼中劃分出來。今天我們就來用

springBoot Aop 來做日志記錄,好了,廢話說了一大堆還是上貨吧。

1、創(chuàng)建日志記錄表、異常日志表,表結構如下

操作日志表OperationLog

CREATE TABLE `OperationLog` (
  `oper_id` varchar(64) DEFAULT NULL COMMENT '主鍵id',
  `oper_modul` varchar(64) DEFAULT NULL COMMENT '功能模塊',
  `oper_type` varchar(64) DEFAULT NULL COMMENT '操作類型',
  `oper_desc` varchar(500) DEFAULT NULL COMMENT '操作描述',
  `oper_requ_param` text COMMENT '請求參數',
  `oper_resp_param` text COMMENT '返回參數',
  `oper_user_id` varchar(64) DEFAULT NULL COMMENT '操作員ID',
  `oper_user_name` varchar(64) DEFAULT NULL COMMENT '操作員名稱',
  `oper_method` varchar(255) DEFAULT NULL COMMENT '操作方法',
  `oper_uri` varchar(255) DEFAULT NULL COMMENT '請求URI',
  `oper_ip` varchar(64) DEFAULT NULL COMMENT '請求ID',
  `oper_create_time` datetime DEFAULT NULL COMMENT '操作時間',
  `oper_ver` varchar(64) DEFAULT NULL COMMENT '操作版本號',
  PRIMARY KEY (`oper_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

使用SpringBoot AOP記錄操作日志和異常日志,spring boot,spring boot

異常日志表ExceptionLog

CREATE TABLE `ExceptionLog` (
  `exp_id` varchar(64) NOT NULL DEFAULT "" COMMENT '主鍵id',
  `exp_requ_param` text COMMENT '請求參數',
  `exp_name` varchar(255) COMMENT '異常名稱',
  `exp_message` text COMMENT '異常信息',
  `oper_user_id` varchar(64) DEFAULT NULL COMMENT '操作員ID',
  `oper_user_name` varchar(64) DEFAULT NULL COMMENT '操作員名稱',
  `oper_method` varchar(255) DEFAULT NULL COMMENT '操作方法',
  `oper_uri` varchar(255) DEFAULT NULL COMMENT '請求URI',
  `oper_ip` varchar(64) DEFAULT NULL COMMENT '請求ID',
  `oper_create_time` datetime DEFAULT NULL COMMENT '操作時間',
  `oper_ver` varchar(64) DEFAULT NULL COMMENT '操作版本號',
  PRIMARY KEY (`exp_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

使用SpringBoot AOP記錄操作日志和異常日志,spring boot,spring boot

2、添加Maven依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
        <relativePath/>
    </parent>

    <groupId>com.aop.log</groupId>
    <artifactId>spring-boot-aop-log</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-aop-log</name>
    <description>spring-boot-aop-log</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- mybatis-plus依賴 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
        </dependency>

        <!-- mysql依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3、創(chuàng)建實體類

ExceptionLog實體

package com.aop.log.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * @author zhangshixing
 * @date 2021年11月05日 10:04
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("ExceptionLog")
public class ExceptionLog {

    // 主鍵id
    @TableId(value = "exp_id", type = IdType.ASSIGN_UUID)
    private String expId;
    // 請求參數
    private String expRequParam;
    // 異常名稱
    private String expName;
    // 異常信息
    private String expMessage;
    // 操作員ID
    private String operUserId;
    // 操作員名稱
    private String operUserName;
    // 操作方法
    private String operMethod;
    // 請求URI
    private String operUri;
    // 請求ID
    private String operIp;
    // 操作時間
    private Date operCreateTime;
    // 操作版本號
    private String operVer;
}

OperationLog實體

package com.aop.log.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;

/**
 * @author zhangshixing
 * @date 2021年11月05日 9:52
 */

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("OperationLog")
public class OperationLog implements Serializable {

    // 主鍵id
    @TableId(value = "oper_id", type = IdType.ASSIGN_UUID)
    private String operId;
    // 功能模塊
    private String operModul;
    // 操作類型
    private String operType;
    // 操作描述
    private String operDesc;
    // 請求參數
    private String operRequParam;
    // 返回參數
    private String operRespParam;
    // 操作員ID
    private String operUserId;
    // 操作員名稱
    private String operUserName;
    // 操作方法
    private String operMethod;
    // 請求URI
    private String operUri;
    // 請求ID
    private String operIp;
    // 操作時間
    private Date operCreateTime;
    // 操作版本號
    private String operVer;
}

OrderInfo訂單實體類

package com.aop.log.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author zhangshixing
 * @date 2021年11月05日 10:33
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderInfo {

    /**
     * 這里只是為了測試所以只添加了兩個參數
     */
    // 訂單編號
    private String orderid;
    // 訂單金額
    private int price;

}

RespBean公共返回對象

package com.aop.log.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author zhangshixing
 * @date 2021年11月05日 10:31
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RespBean {

    private long code;
    private String message;
    private Object obj;

    public static RespBean success(String message) {

        return new RespBean(200, message, null);
    }

    public static RespBean success(String message, Object obj) {

        return new RespBean(200, message, obj);
    }

    public static RespBean error(String message) {

        return new RespBean(500, message, null);
    }

    public static RespBean error(String message, Object obj) {

        return new RespBean(500, message, obj);
    }
}

4、創(chuàng)建Mapper

OperationLogMapper

package com.aop.log.mapper;

import com.aop.log.entity.OperationLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface OperationLogMapper extends BaseMapper<OperationLog> {

}

ExceptionLogMapper

package com.aop.log.mapper;

import com.aop.log.entity.ExceptionLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ExceptionLogMapper extends BaseMapper<ExceptionLog> {

}

5、創(chuàng)建service

OperationLogService

package com.aop.log.service;

import com.aop.log.entity.OperationLog;
import com.baomidou.mybatisplus.extension.service.IService;

public interface OperationLogService extends IService<OperationLog> {
}

ExceptionLogService

package com.aop.log.service;

import com.aop.log.entity.ExceptionLog;
import com.baomidou.mybatisplus.extension.service.IService;

public interface ExceptionLogService extends IService<ExceptionLog> {

}

OperationLogServiceImpl

package com.aop.log.service.impl;

import com.aop.log.entity.OperationLog;
import com.aop.log.mapper.OperationLogMapper;
import com.aop.log.service.OperationLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
 * @author zhangshixing
 * @date 2021年11月05日 10:10
 */
@Service
public class OperationLogServiceImpl extends ServiceImpl<OperationLogMapper, OperationLog>
        implements OperationLogService {
}

ExceptionLogServiceImpl

package com.aop.log.service.impl;

import com.aop.log.entity.ExceptionLog;
import com.aop.log.mapper.ExceptionLogMapper;
import com.aop.log.service.ExceptionLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
 * @author zhangshixing
 * @date 2021年11月05日 10:10
 */
@Service
public class ExceptionLogServiceImpl extends ServiceImpl<ExceptionLogMapper, ExceptionLog>
        implements ExceptionLogService {
}

6、創(chuàng)建操作日志注解類OperLog

package com.aop.log.annotation;

import java.lang.annotation.*;

/**
 * @author zhangshixing
 * @date 2021年11月05日 9:43
 * 自定義操作日志注解
 */
//注解放置的目標位置,METHOD是可注解在方法級別上
@Target(ElementType.METHOD)
//注解在哪個階段執(zhí)行
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OperLog {
    // 操作模塊
    String operModul() default "";

    // 操作類型
    String operType() default "";

    // 操作說明
    String operDesc() default "";
}
package com.aop.log.annotation;

public class OprLogConst {

    public static final String ADD = "add";
    public static final String INSERET = "insert";
    public static final String UPDATE = "update";
    public static final String DELETE = "delete";
}

7、創(chuàng)建切面類記錄操作日志

package com.aop.log.aop;

import com.alibaba.fastjson.JSON;
import com.aop.log.annotation.OperLog;
import com.aop.log.entity.ExceptionLog;
import com.aop.log.entity.OperationLog;
import com.aop.log.service.ExceptionLogService;
import com.aop.log.service.OperationLogService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @author zhangshixing
 * @date 2021年11月05日 9:46
 * 切面處理類,操作日志異常日志記錄處理
 */
@Aspect
@Component
public class OperLogAspect {

    /**
     * 操作版本號
     * 項目啟動時從命令行傳入,例如:java -jar xxx.war --version=201902
     */
    @Value("${version}")
    private String operVer;

    @Autowired
    private OperationLogService operationLogService;

    @Autowired
    private ExceptionLogService exceptionLogService;

    /**
     * 設置操作日志切入點 記錄操作日志 在注解的位置切入代碼
     */
    @Pointcut("@annotation(com.aop.log.annotation.OperLog)")
    public void operLogPoinCut() {
    }

    /**
     * 設置操作異常切入點記錄異常日志 掃描所有controller包下操作
     */
    @Pointcut("execution(* com.aop.log.controller..*.*(..))")
    public void operExceptionLogPoinCut() {
    }

    /**
     * 正常返回通知,攔截用戶操作日志,連接點正常執(zhí)行完成后執(zhí)行, 如果連接點拋出異常,則不會執(zhí)行
     *
     * @param joinPoint 切入點
     * @param keys      返回結果
     */
    @AfterReturning(value = "operLogPoinCut()", returning = "keys")
    public void saveOperLog(JoinPoint joinPoint, Object keys) {
        // 獲取RequestAttributes
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        // 從獲取RequestAttributes中獲取HttpServletRequest的信息
        HttpServletRequest request = (HttpServletRequest) requestAttributes
                .resolveReference(RequestAttributes.REFERENCE_REQUEST);
        // 創(chuàng)建OperationLog對象
        OperationLog operlog = new OperationLog();
        try {
            // 主鍵ID
            String uuid = UUID.randomUUID().toString();
            System.out.println("saveOperLog:" + uuid);
            operlog.setOperId(uuid);
            // 從切面織入點處通過反射機制獲取織入點處的方法
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            // 獲取切入點所在的方法
            Method method = signature.getMethod();
            // 獲取操作
            OperLog opLog = method.getAnnotation(OperLog.class);
            if (opLog != null) {
                String operModul = opLog.operModul();
                String operType = opLog.operType();
                String operDesc = opLog.operDesc();
                // 操作模塊
                operlog.setOperModul(operModul);
                // 操作類型
                operlog.setOperType(operType);
                // 操作描述
                operlog.setOperDesc(operDesc);
            }
            // 獲取請求的類名
            String className = joinPoint.getTarget().getClass().getName();
            // 獲取請求的方法名
            String methodName = method.getName();
            methodName = className + "." + methodName;
            // 請求方法
            operlog.setOperMethod(methodName);
            // 請求的參數
            Map<String, String> rtnMap = converMap(request.getParameterMap());
            // 將參數所在的數組轉換成json
            String params = JSON.toJSONString(rtnMap);
            // 請求參數
            operlog.setOperRequParam(params);
            // 返回結果
            operlog.setOperRespParam(JSON.toJSONString(keys));
            // 請求用戶ID
            // operlog.setOperUserId(UserShiroUtil.getCurrentUserLoginName());
            // 這里寫一個固定的用戶ID
            operlog.setOperUserId("100293784");
            // 請求用戶名稱
            // operlog.setOperUserName(UserShiroUtil.getCurrentUserName());
            // // 這里寫一個固定的用戶名
            operlog.setOperUserName("yiyiyi");
            // 請求IP
            // operlog.setOperIp(IPUtil.getRemortIP(request));
            // 這里寫一個固定的IP
            operlog.setOperIp("127.0.0.1");
            // 請求URI
            operlog.setOperUri(request.getRequestURI());
            // 創(chuàng)建時間
            operlog.setOperCreateTime(new Date());
            // 操作版本
            operlog.setOperVer(operVer);
            // 將數據插入到數據庫
            operationLogService.save(operlog);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 異常返回通知,用于攔截異常日志信息 連接點拋出異常后執(zhí)行
     *
     * @param joinPoint 切入點
     * @param e         異常信息
     */
    @AfterThrowing(pointcut = "operExceptionLogPoinCut()", throwing = "e")
    public void saveExceptionLog(JoinPoint joinPoint, Throwable e) {
        // 獲取RequestAttributes
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        // 從獲取RequestAttributes中獲取HttpServletRequest的信息
        HttpServletRequest request = (HttpServletRequest) requestAttributes
                .resolveReference(RequestAttributes.REFERENCE_REQUEST);
        ExceptionLog excepLog = new ExceptionLog();
        try {
            // 從切面織入點處通過反射機制獲取織入點處的方法
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            // 獲取切入點所在的方法
            Method method = signature.getMethod();
            String uuid = UUID.randomUUID().toString();
            System.out.println("saveExceptionLog:" + uuid);
            excepLog.setExpId(uuid);
            // 獲取請求的類名
            String className = joinPoint.getTarget().getClass().getName();
            // 獲取請求的方法名
            String methodName = method.getName();
            methodName = className + "." + methodName;
            // 請求的參數
            Map<String, String> rtnMap = converMap(request.getParameterMap());
            // 將參數所在的數組轉換成json
            String params = JSON.toJSONString(rtnMap);
            // 請求參數
            excepLog.setExpRequParam(params);
            // 請求方法名
            excepLog.setOperMethod(methodName);
            // 異常名稱
            excepLog.setExpName(e.getClass().getName());
            // 異常信息
            excepLog.setExpMessage(stackTraceToString(e.getClass().getName(), e.getMessage(), e.getStackTrace()));
            // 操作員ID
            // excepLog.setOperUserName(UserShiroUtil.getCurrentUserName());
            excepLog.setOperUserId("100293784");
            // 操作員名稱
            excepLog.setOperUserName("yiyiyi");
            // 操作URI
            excepLog.setOperUri(request.getRequestURI());
            // 操作員IP
            // excepLog.setOperIp(IPUtil.getRemortIP(request));
            excepLog.setOperIp("127.0.0.1");
            // 操作版本號
            excepLog.setOperVer(operVer);
            // 發(fā)生異常時間
            excepLog.setOperCreateTime(new Date());
            exceptionLogService.save(excepLog);
        } catch (Exception e2) {
            e2.printStackTrace();
        }

    }

    /**
     * 轉換request 請求參數
     *
     * @param paramMap request獲取的參數數組
     */
    public Map<String, String> converMap(Map<String, String[]> paramMap) {
        Map<String, String> rtnMap = new HashMap<String, String>();
        for (String key : paramMap.keySet()) {
            rtnMap.put(key, paramMap.get(key)[0]);
        }
        return rtnMap;
    }

    /**
     * 轉換異常信息為字符串
     *
     * @param exceptionName    異常名稱
     * @param exceptionMessage 異常信息
     * @param elements         堆棧信息
     */
    public String stackTraceToString(String exceptionName, String exceptionMessage, StackTraceElement[] elements) {
        StringBuffer strbuff = new StringBuffer();
        for (StackTraceElement stet : elements) {
            strbuff.append(stet + "\n");
        }
        String message = exceptionName + ":" + exceptionMessage + "\n\t" + strbuff.toString();
        return message;
    }
}

8、在Controller層方法添加@OperLog注解

package com.aop.log.controller;

import com.aop.log.annotation.OperLog;
import com.aop.log.annotation.OprLogConst;
import com.aop.log.entity.OrderInfo;
import com.aop.log.entity.RespBean;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author zhangshixing
 * @date 2021年11月05日 10:25
 */
@Controller
public class OrderController {
    /**
     * 新增訂單信息
     */
    @RequestMapping(value = "addOrderInfo")
    @ResponseBody
    @OperLog(operModul = "銷售管理-訂單新增", operType = OprLogConst.ADD, operDesc = "訂單新增功能")
    public RespBean addOrderInfo(OrderInfo orderInfo) {
        if (orderInfo.getPrice() < 0) {
            System.out.println(1 / 0);
            return RespBean.error("提交失敗!!!");
        } else if (orderInfo.getPrice() < 30) {
            return RespBean.success("提交成功!!!");
        } else {
            return RespBean.error("提交失敗!!!");
        }
    }
}

9、啟動類和配置文件

version = 2.1.1
server.port = 9000
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/log?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username = root
spring.datasource.password = root
package com.aop.log;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootAopLogApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootAopLogApplication.class, args);
	}

}

10、操作日志、異常日志查詢功能

10.1 記錄操作日志

使用SpringBoot AOP記錄操作日志和異常日志,spring boot,spring boot

使用SpringBoot AOP記錄操作日志和異常日志,spring boot,spring boot

使用SpringBoot AOP記錄操作日志和異常日志,spring boot,spring boot

使用SpringBoot AOP記錄操作日志和異常日志,spring boot,spring boot

10.2 記錄異常日志

使用SpringBoot AOP記錄操作日志和異常日志,spring boot,spring boot

使用SpringBoot AOP記錄操作日志和異常日志,spring boot,spring boot

11、execution 表達式

學習Spring中的aop組裝切面時遇到的execution表達式,下面是execution表達式的詳解。

切入點表達式:

整個表達式可以分為五個部分:

1、execution(): 表達式主體。

2、第一個*號:方法返回類型, *號表示所有的類型。

3、包名:表示需要攔截的包名。

4、第二個*號:表示類名,*號表示所有的類。

5、*(..):最后這個星號表示方法名,*號表示所有的方法,后面( )里面表示方法的參數,兩個句點表示任

何參數。

表達式語法:

execution(* 包名.*.*(..))

規(guī)范寫法:execution(* com.baizhi.service.UserServiceImpl.*(..))

這個表達式是重點 ,是最通用的,表示執(zhí)行接口下的所有接口方法。

execution表達式舉例:

書寫接口實現方法:UserServiceImpl

方法類型:

add(); query(); add(String name); add(User user); add(String name,Integer age);

execution(* service.UserServiceImpl.add(..))        //執(zhí)行add()方法
execution(* service.UserServiceImpl.add(String))    //執(zhí)行add(String name)方法
execution(* service.UserServiceImpl.add(com.baizhi.entity.User))   //執(zhí)行add(User user)方法
execution(* service.UserServiceImpl.add(String , Integer))    //執(zhí)行add(String name,Interger age)方法

execution表達式的一般用法:

execution(* service.UserServiceImpl.*(java.util.List))
返回值:任意
包:com.baizhi.service
類:UserServiceImpl
方法:任意
參數:必須是List集合
execution(* service.UserServiceImpl.add*(..))  重點
返回值:任意
包:com.baizhi.service
類:UserServiceImpl
方法:以add關鍵字開頭的方法
參數:任意
execution(* service.UserServiceImpl.*.*(..))  重點
返回值:任意
包:com.baizhi.service
類:當前包下的所有類
方法:所有類中的所有方法
參數:任意
execution(* service..*.*(..))  重點
返回值:任意
包:service包以及它下面所有子包
類:所有包中的所有類
方法:所有類中的所有方法
參數:任意
execution(* *(..))   重點,不建議這樣寫,棧溢出

注意:要盡可能精準的切入。文章來源地址http://www.zghlxwxcb.cn/news/detail-766349.html

到了這里,關于使用SpringBoot AOP記錄操作日志和異常日志的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Spring Boot入門(23):記錄接口日志再也不難!用AOP和自定義注解給Spring Boot加上日志攔截器!

    Spring Boot入門(23):記錄接口日志再也不難!用AOP和自定義注解給Spring Boot加上日志攔截器!

    ? ? ? ? 在上兩期中,我們著重介紹了如何集成使用 Logback?與?log4j2?日志框架的使用,今天我們講解的主題依舊跟日志有關,不過不是使用何種開源框架,而是自己動手造。 ? ? ? ? Spring的核心之一AOP;AOP翻譯過來叫面向切面編程, 核心就是這個切面. 切面表示從業(yè)務邏輯中

    2024年02月11日
    瀏覽(25)
  • Java使用Aop實現用戶操作日志記錄(新手入門)

    Java使用Aop實現用戶操作日志記錄(新手入門)

    導入打印日志,aop,hutool,的依賴,Hutool是一個Java工具包,里面封裝了大量的常用工具類,到時候咱們就通過這個工具包中有一個工具類可以用來獲取客戶端IP地址。 自定義操作類型枚舉類 因為基本是增刪改查四個方法 自定義用來記錄用戶操作日志的注解 寫一個方法加上我

    2024年02月06日
    瀏覽(17)
  • Spring Boot 如何使用 JUL 進行日志記錄

    Spring Boot 如何使用 JUL 進行日志記錄

    在 Spring Boot 中,我們可以使用多種日志框架進行日志記錄。其中,JUL (Java Util Logging) 是 Java 平臺自帶的日志框架,它提供了簡單的 API 和配置,可以輕松地進行日志記錄。本文將介紹如何在 Spring Boot 中使用 JUL 進行日志記錄,并提供示例代碼。 默認情況下,Spring Boot 使用 L

    2024年02月10日
    瀏覽(39)
  • AOP案例-記錄日志操作

    目錄 案例 操作日志 思路分析 步驟 準備 編碼 將案例中的增刪改接口的操作日志記錄到數據表中 操作日志 日志信息包括:操作人、操作時間、執(zhí)行方法的全類名、執(zhí)行方法名、方法運行時的參數、返回值、犯法運行時長。 思路分析 需要對于所有業(yè)務類中的增刪改查方法統

    2024年02月09日
    瀏覽(19)
  • 【Spring Boot】通過AOP攔截Spring Boot日志并將其存入數據庫

    【Spring Boot】通過AOP攔截Spring Boot日志并將其存入數據庫

    在軟件開發(fā)中,常常需要記錄系統運行時的日志。日志記錄有助于排查系統問題、優(yōu)化系統性能、監(jiān)控操作行為等。本文將介紹如何使用Spring Boot和AOP技術實現攔截系統日志并保存到數據庫中的功能。 本文將通過以下步驟實現攔截系統日志并保存到數據庫中的功能: 配置數據

    2024年02月10日
    瀏覽(21)
  • Spring Boot 自定義注解,AOP 切面統一打印出入參請求日志

    Spring Boot 自定義注解,AOP 切面統一打印出入參請求日志

    今天主要說說如何通過自定義注解的方式,在 Spring Boot 中來實現 AOP 切面統一打印出入參日志。小伙伴們可以收藏一波。 廢話不多說,進入正題! 在看看實現方法之前,我們先看下切面日志輸出效果咋樣: 從上圖中可以看到,每個對于每個請求,開始與結束一目了然,并且

    2024年02月08日
    瀏覽(22)
  • 使用SpringBoot記錄用戶操作日志

    在工作中我們可能會遇到一個需求,就是記錄用戶的操作信息,接下來使用spring的aop特性實現這一需求 一、首先引入我們必要的一些依賴 二、自定義一個注解,用于標注需要監(jiān)控的方法 三、在數據庫中創(chuàng)建一張表,用來保存用戶的操作日志 字段可以有? 用戶名? 用戶操作

    2024年02月06日
    瀏覽(24)
  • Spring Boot入門(23):基于AOP實現自定義注解攔截接口日志并保存入庫 | 超級詳細,建議收藏

    Spring Boot入門(23):基于AOP實現自定義注解攔截接口日志并保存入庫 | 超級詳細,建議收藏

    ? ? ? ? 在上兩期中,我們著重介紹了如何集成使用 Logback?與?log4j2?日志框架的使用,今天我們講解的主題依舊跟日志有關,不過不是使用何種開源框架,而是自己動手造。 ? ? ? ? Spring的核心之一AOP;AOP翻譯過來叫面向切面編程, 核心就是這個切面. 切面表示從業(yè)務邏輯中

    2024年02月11日
    瀏覽(28)
  • springboot 統一異常處理 + 日志記錄

    springboot 統一異常處理 + 日志記錄

    ??????在項目的開發(fā)中,在某些情況下,比如非業(yè)務的操作,日志記錄,權限認證和異常處理等。我們需要對客戶端發(fā)出的請求進行攔截,常用的API攔截方式有Fliter,Interceptor,ControllerAdvice以及Aspect。先簡單介紹一下不同的攔截方式。 可以獲得Http原始的請求和響應信息,

    2023年04月17日
    瀏覽(94)
  • SpringBoot小項目——簡單的小區(qū)物業(yè)后臺管理系統 & 認證鑒權 用戶-角色模型 & AOP切面日志 & 全局異?!驹创a】

    SpringBoot小項目——簡單的小區(qū)物業(yè)后臺管理系統 & 認證鑒權 用戶-角色模型 & AOP切面日志 & 全局異?!驹创a】

    基于SpringBoot的簡單的小區(qū)物業(yè)后臺管理系統,主要功能有報修的處理,樓宇信息和房屋信息的管理,業(yè)主信息的管理【核心】,以及數據統計分析模塊Echarts繪圖;此外采用用戶-角色權限模型,結合自定義注解實現簡單的權限管理功能,采用aop切面實現日志的存儲,全局異常

    2024年02月06日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包