Spring Boot @Aspect日志记录

时间:2018-09-28 12:38:00

标签: spring spring-boot logging aspect

我尝试使用@Aspect记录所有请求和响应。如果我的端点具有@RequestBody,则我的代码正在运行,但是我的get端点没有@RequestBody,并且我看不到日志。对这种情况有什么解释吗?

那样我的课;

@Aspect
@Component
@Slf4j
@RequiredArgsConstructor(onConstructor = @__({@Autowired, @NotNull}))
public class AspectLogging {

    private final ObjectMapper objectMapper;

    @Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping) || @annotation(org.springframework.web.bind.annotation.PostMapping)")
    public void annotationPointCutDefinition() {

    }

    @Pointcut("execution(* *(com.dux.secondwallet.api.v3.pay.merchant.*))")
    public void atExecution() {
    }

    @Before("annotationPointCutDefinition() && atExecution()")
    public void endpointBefore(JoinPoint p) {
        Object[] signatureArgs = p.getArgs();
        if (Objects.nonNull(signatureArgs) && signatureArgs.length > 0) {
            log.info("Request object: " + signatureArgs[0]);
        }
    }

    @AfterReturning(pointcut = "annotationPointCutDefinition() && atExecution()", returning = "returnValue")
    public void endpointAfterReturning(Object returnValue) {
        try {
            log.info("Response object:" + objectMapper.writeValueAsString(returnValue));
        } catch (JsonProcessingException e) {
            log.error(e.getMessage(), e);
        }
    }


    @AfterThrowing(pointcut = "annotationPointCutDefinition() && atExecution()", throwing = "e")
    public void endpointAfterThrowing(JoinPoint p, Exception e) throws Exception {
        e.printStackTrace();
        log.error(p.getTarget().getClass().getSimpleName() + " " + p.getSignature().getName() + " " + e.getMessage());
    }
}

示例控制器; getRequest方法未记录日志,postRequest已记录日志。

 @Slf4j
@RestController
@RequestMapping("/v3/")
public class MyController {

    @GetMapping("/balances")//not before and after logging
    public List<java.lang.String> getRequest() {
        return Collections.singletonList("TEST");
    }

    @PostMapping("/limits")//its logging
    public TransactionLimitResponse postRequest(@Valid @RequestBody TransactionLimitRequest transactionLimitRequest) {
        return TransactionLimitResponse.builder()
                .currency("EUR")
                .type("TYPE")
                .min(100)
                .max(1000)
                .build();
    }
}

2 个答案:

答案 0 :(得分:3)

首先,我想问你想登录什么?

方面代码的目的是记录方法参数,并且@GetMapping方法上没有任何参数。

因此,您的Aspect方法也已成功为@GetMapping触发。但是只要检查条件并通过即可。您看不到日志是很正常的。

应用下面的更改将起作用:

code

@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)") //@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping) || @annotation(org.springframework.web.bind.annotation.PostMapping))") public void getMapping() { } @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)") //@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping) || @annotation(org.springframework.web.bind.annotation.PostMapping))") public void postMapping() { } @Pointcut("execution(* *(..)) && within(com.dux.secondwallet.api.v3.pay.merchant.*))") public void atExecution() { } @Before("(getMapping() || postMapping()) && atExecution()") public void endpointBefore(JoinPoint p) { log.info("ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"); Object[] signatureArgs = p.getArgs(); if (Objects.nonNull(signatureArgs) && signatureArgs.length > 0) { log.info("Request object: " + signatureArgs[0]); }else{ log.info("log for get"); } } :用于您的方法签名。

execution(* *(..))这是软件包限制。

答案 1 :(得分:1)

您的切入点定义不正确。使用@Pointcut("execution(* com.dux.secondwallet.api.v3.pay.merchant.*.*(..))"),切入点将匹配已定义包下类中的所有方法。

提示

此外,您应该对Aspect-Configuration类使用@Configuration而不是@Component。此外,通过在实例字段上使用@NonNull,您可以跳过@RequiredArgsConstructor的配置。