ホームページ  >  記事  >  Java  >  ロギング用の Spring AOP

ロギング用の Spring AOP

Barbara Streisand
Barbara Streisandオリジナル
2024-10-22 20:44:02524ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。