>Java >java지도 시간 >로깅을 위한 Spring AOP

로깅을 위한 Spring AOP

Barbara Streisand
Barbara Streisand원래의
2024-10-22 20:44:02600검색

Spring AOP pour la journalisation

AOP(Aspect Oriented 프로그래밍)는 비즈니스 코드와 기술 코드를 분리할 수 있는 프로그래밍 패러다임입니다. 이 패러다임은 많은 개발자들에 의해 다소 무시되고 있지만 매우 강력한 도구입니다.
이 튜토리얼에서는 스프링 부트 3을 사용하여 서비스를 로깅하는 데 이 패러다임을 적용하려고 합니다.

전제조건

  • JDK 17
  • IDE
  • 메이븐 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()")로 표시된 메소드는 현재 듣고 있는 서비스가 실행되기 전에 호출됩니다
  • Listening 서비스 실행 중 오류가 감지될 때마다 AfterThrowing() 주석이 달린 메소드가 실행됩니다.
  • AfterReturning()이라고 표시된 메소드는 서비스 실행이 오류 없이 완료되었을 때 실행됩니다

이 로깅 기술은 유지 관리가 가능하고 깔끔한 코드를 유지하는 데 도움이 됩니까?

위 내용은 로깅을 위한 Spring AOP의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.