记录 Spring AOP

Logging which Spring AOP

我正在尝试为我的 api 添加日志,但我的代码中有关于方面的问题。

我的项目有以下结构,经典结构控制器和服务

com.surname.apiproject.sports
com.surname.apiproject.sports.SportController
com.surname.apiproject.sports.SportService
com.surname.apiproject.users
com.surname.apiproject.users.UserController
com.surname.apiproject.users.UserService

我有以下 Spring AOP。

@Around("execution(* com.fernandez.api.project.*.*(..))")
    public void time(final ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        DateFormat df = DateFormat.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SSS");
        String dateString = format.format(new Date());      
        String random = randomUUID();
        Object value;
        try {
            value = proceedingJoinPoint.proceed();
        } catch (Throwable throwable) {
            throw throwable;
        } finally {
            long duration = System.currentTimeMillis() - start;
            log.info("--- UUID3 --- : " + random + " --- Fecha ---" + dateString +" --- Camino --- :"+ proceedingJoinPoint.getSignature().getDeclaringType().getSimpleName() +  " --Name --- " +proceedingJoinPoint.getSignature().getName());
        }

    }

当我尝试执行请愿书时,我没有看到任何关于 petiion 的信息,但是如果我使用过滤器,我可以看到请愿书,所以我不知道如果使用 SpringAOP 或哪个是最佳选择日志记录过滤器。

此致

如果您的日志记录与 servlet API 请求有关,则使用 Filter。否则使用 AOP。您还应该在计算所用时间之前检查记录器是否已启用,并使用日志 API 的格式而不是字符串连接。

如果是前者,Spring 已经启动 configures a metrics filter 以收集 API 性能数据。您可能会发现这已经足够了。

对于更高级的性能跟踪,您可以使用像 Elastic's or DataDog's 这样的 APM 代理。


第一个选项的示例

@Order(Ordered.HIGHEST_PRECEDENCE)
public class PerformanceLogFilter extends OncePerRequestFilter {

    private static final DateTimeFormatter FORMAT 
            = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss.SSS");

    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) {
        return !logger.isInfoEnabled();
    }

    @Override
    protected void doFilterInternal(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain filterChain
    ) throws ServletException, IOException
    {
        Instant start = Instant.now();
        try {
            filterChain.doFilter(request, response);
        } finally {
            // N.B. commons-logging, not slf4j
            logger.info(String.format("%s %s: %.1f ms",
                    start.atZone(ZoneId.systemDefault()).format(FORMAT),
                    request.getRequestURI(),
                    start.until(Instant.now(), ChronoUnit.MICROS) * 1e-3
            ));
        }
    }