Если ваше ведение журнала относится к запросам 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
));
}
}