gpt4 book ai didi

java - 记录哪个 Spring AOP

转载 作者:行者123 更新时间:2023-11-29 04:08:27 27 4
gpt4 key购买 nike

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

我的项目有以下结构,经典结构 Controller 和服务

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 Boot 已经configures a metrics filter收集 API 性能数据。您可能会发现这已经足够了。

对于更高级的性能跟踪,您可以使用类似 Elastic's 的 APM 代理或 DataDog's .


第一个选项的示例

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

关于java - 记录哪个 Spring AOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56690434/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com