Ведение журнала какой Spring AOP - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь добавить журнал для моего 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());
        }

    }

Когда я пытаюсь выполнить петицию, я не вижу ничего о петиции, но если я использую Фильтры, я мог видеть петицию, поэтому я не знаю, какой вариант лучше, если использовать SpringAOP или Фильтры для ведения журнала.

С уважением

1 Ответ

3 голосов
/ 20 июня 2019

Если ваше ведение журнала относится к запросам API сервлетов, используйте Filter. В противном случае используйте АОП. Вы также должны проверить, включен ли регистратор, прежде чем пытаться вычислить затраченное время, и использовать форматирование API журнала вместо конкатенации строк.

Если первое, Spring Boot уже настраивает фильтр метрик для сбора данных о производительности API. Вы можете обнаружить, что этого уже достаточно.

Для более расширенного отслеживания производительности вы можете использовать агент APM, например Elastic's или DataDog .


Пример для первого варианта

@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
            ));
        }
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...