记录 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
));
}
}
我正在尝试为我的 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
));
}
}