溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringBoot?Start組件開發(fā)之記錄接口日志信息怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2023-04-28 10:52:42 來源:億速云 閱讀:121 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了SpringBoot Start組件開發(fā)之記錄接口日志信息怎么實(shí)現(xiàn)的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇SpringBoot Start組件開發(fā)之記錄接口日志信息怎么實(shí)現(xiàn)文章都會(huì)有所收獲,下面我們一起來看看吧。

目標(biāo)

基于 AOP 實(shí)現(xiàn)系統(tǒng)監(jiān)控,主要是通過aop切面功能來增強(qiáng)方法,實(shí)現(xiàn)監(jiān)控。

設(shè)計(jì)

項(xiàng)目結(jié)構(gòu)

cn-anoxia-start-log
└── src
    ├── main
    │   └── java
    │       ├── cn.anoxia.log
    │       │   ├── annotation
    │       │   │   └── LogCheck.java
    │       │   ├── config
    │       │   │   └── LogAutoConfigure.java
    │       │   └── LogCheckJoinPoint.java
    │       └── resources
    │           └── META-INF 
    │               └── spring.factories
    └── test
        └── java
            └── cn.anoxia.log.test
                └── ApiTest.java

實(shí)現(xiàn)過程主要是通過AOP攔截注解,然后對(duì)方法進(jìn)行處理

  • LogCheck 自定義注解,主要作用就是添加到需要監(jiān)控的方法上。

  • LogAutoConfigure 配置類,對(duì)一些類做初始化操作。

  • LogCheckJoinPoint 核心類,負(fù)責(zé)對(duì)攔截的方法做邏輯處理。

  • spring.factories spring-boot 自動(dòng)注入的配置文件。

springboot 在啟動(dòng)的時(shí)候 讀取spring.factories里面的內(nèi)容,然后把配置類添加到spring容器中。 使用 springboot的自動(dòng)注入的功能完成配置的加載。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.anoxia.log.config.LogAutoConfigure

自定義攔截注解LogCheck

/**
 * @description: 方法耗時(shí)檢測注解
 * @author:huangle
 * @date: 2022/7/22
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface LogCheck {
    String key() default "";
    String desc() default "";
}

AOP 處理類, 定義切點(diǎn)為 注解,然后使用 環(huán)繞處理 對(duì)方法進(jìn)行增強(qiáng)。

/**
 * @description: aop攔截注解,進(jìn)行方法增強(qiáng)
 * @author:huangle
 * @date: 2022/7/22
 */
@Aspect
@Component
public class LogCheckJoinPoint {
    private final Logger logger = LoggerFactory.getLogger(LogCheckJoinPoint.class);
    @Pointcut("@annotation(cn.anoxia.log.annotation.LogCheck)")
    public void aopPoint(){
        // 定義切點(diǎn)
    }
    @Around("aopPoint() && @annotation(logCheck)")
    public void doCheck(ProceedingJoinPoint joinPoint, LogCheck logCheck) throws Throwable {
        // 執(zhí)行前增強(qiáng)
        logger.info("當(dāng)前執(zhí)行的類:{}",joinPoint.getClass());
        Method method = getMethod(joinPoint);
        Long start = System.currentTimeMillis();
        try {
            // 執(zhí)行目標(biāo)方法
            joinPoint.proceed();
        }finally {
            System.out.println("監(jiān)控 - Begin By AOP");
            System.out.println("監(jiān)控索引:" + logCheck.key());
            System.out.println("監(jiān)控描述:" + logCheck.desc());
            System.out.println("方法名稱:" + method.getName());
            System.out.println("方法耗時(shí):" + (System.currentTimeMillis() - start) + "ms");
            System.out.println("監(jiān)控 - End\r\n");
        }
    }
    private Method getMethod(JoinPoint jp) throws NoSuchMethodException {
        Signature sig = jp.getSignature();
        MethodSignature methodSignature = (MethodSignature) sig;
        return jp.getTarget().getClass().getMethod(methodSignature.getName(), methodSignature.getParameterTypes());
    }
}

配置類里面的內(nèi)容, 對(duì)核心類進(jìn)行初始化,并且添加到spring容器

@Configuration
public class LogAutoConfigure implements EnvironmentAware {
    private final Logger logger = LoggerFactory.getLogger(LogAutoConfigure.class);
    private final Map<String,Object> logConfigMap = new HashMap<>();
    @Bean
    @ConditionalOnMissingBean
    public LogCheckJoinPoint point(){
        return new LogCheckJoinPoint();
    }
}

測試

創(chuàng)建一個(gè)項(xiàng)目,然后導(dǎo)入我們創(chuàng)建的start

<dependency>
            <groupId>cn.anoxia</groupId>
            <artifactId>anoxia-spring-start-log</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>

添加注解,攔截方法

@LogCheck(key = "cn.anoxia.demo.controller.TestController",desc = "獲取用戶信息")
    @RequestMapping("/v1/info")
    public String testController(){
        return "hello";
    }

測試結(jié)果,可以獲取到執(zhí)行方法的一些信息,并且對(duì)方法進(jìn)行增強(qiáng)。

SpringBoot?Start組件開發(fā)之記錄接口日志信息怎么實(shí)現(xiàn)

關(guān)于“SpringBoot Start組件開發(fā)之記錄接口日志信息怎么實(shí)現(xiàn)”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“SpringBoot Start組件開發(fā)之記錄接口日志信息怎么實(shí)現(xiàn)”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI