首頁 >Java >java教程 >用於日誌記錄的 Spring AOP

用於日誌記錄的 Spring AOP

Barbara Streisand
Barbara Streisand原創
2024-10-22 20:44:02603瀏覽

Spring AOP pour la journalisation

AOP(面向方面​​程式設計)是一種允許業務程式碼與技術程式碼分離的程式設計範例。這種範例在某種程度上被許多開發人員忽視,但卻是一個非常強大的工具。
在本教程中,我們將嘗試使用 Spring Boot 3 來應用此範例來記錄我們的服務。

先決條件

  • JDK 17
  • IDE
  • maven 3.x

要新增的依賴項

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
            <version>3.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

LoggingAspect.java
這個類別將包含我們用於日誌記錄的 AOP:

package dev.tuxbe.democonfig.contracts;

import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.JoinPoint;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Aspect
@Component
@Slf4j
public class LoggingAspect {

    @Pointcut("execution(* dev.tuxbe.democonfig.services.*.*(..))")
    public void serviceMethods() {
    }

    @Before("serviceMethods()")
    public void logBeforeServiceMethods(JoinPoint joinpoint) {
        String name = joinpoint.getSignature().getName();
        log.info("Début de traitement de la method {} avec pour parametre {}", name, joinpoint.getArgs());
    }

    @AfterReturning(value = "serviceMethods()", returning = "proceed")
    public void logAfterReturningServiceMethods(JoinPoint joinpoint, Object proceed) {
        String methodName = joinpoint.getSignature().getName();
        Object[] args = joinpoint.getArgs();

        // Logiquement, si nous atteignons ce point, le traitement s'est bien terminé
        log.info("Méthode {} exécutée avec succès avec les arguments {}", methodName, args);
        log.info("Résultat : {}", proceed);
    }

    @AfterThrowing(pointcut = "serviceMethods()", throwing = "ex")
    public void logAfterThrowingServiceMethods(JoinPoint joinPoint, Throwable ex) {
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();

        // Récupérer la requête HTTP
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        String uri = request.getRequestURI();
        String method = request.getMethod();

        // Logiquement, si nous atteignons ce point, une exception a été levée pendant l'exécution de la méthode
        log.info("{} : {} exécutée avec echec avec les arguments {}",method, uri, args);
        log.info("Message d'error : {}", ex.getMessage());
    }
}

  • @Pointcut() 允許您在每次呼叫 dev.tuxbe.democonfig.services 套件中找到的方法時標記一個監聽點。
  • @Before("serviceMethods()")註解的方法在執行你正在監聽的服務之前呼叫
  • AfterThrowing() 註解的方法,每次在監聽的服務執行過程中偵測到錯誤時都會執行。
  • AfterReturning() 註解的方法在服務執行完成且沒有錯誤的情況下執行

這種日誌記錄技術可以幫助您擁有可維護且乾淨的程式碼嗎?

以上是用於日誌記錄的 Spring AOP的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn