首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >记录哪个Spring AOP

记录哪个Spring AOP
EN

Stack Overflow用户
提问于 2019-06-20 16:36:15
回答 1查看 663关注 0票数 1

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

我的项目有折叠结构,经典结构控制器和服务。

代码语言:javascript
复制
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。

代码语言:javascript
复制
@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还是过滤器进行日志记录,哪种是最好的选择。

问候

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-20 16:46:47

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

如果前者,Spring已经收集了配置度量筛选器。的性能数据。你可能会发现这已经足够了。

对于更高级的性能跟踪,可以使用像弹性的数据狗这样的APM代理。

第一个选项的示例

代码语言:javascript
复制
@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
            ));
        }
    }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56690434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档