使用Spring AOP记录请求的每种方法的执行时间

时间:2018-08-05 16:16:20

标签: spring-boot logging slf4j spring-aop

假设我有一个具有简单架构(控制器,服务,存储库)的基本Spring引导应用程序。我试图记录应用程序中每一层的执行时间(以及每一层的不同情况),我试图使用带有@Around Aspect的Spring AOP来执行此操作。事实是该应用程序是一个并发应用程序,并且可以同时出现多个请求,因此,如果我做这样的事情:

 @Around("controller() || restController() ")
 public Object logAround(final ProceedingJoinPoint joinPoint) throws Throwable {
    log.info("time elapsed" + timeElapsed)
    //Log some other Controller useful info
 }

 @Around("service() ")
 public Object logAround(final ProceedingJoinPoint joinPoint) throws Throwable {
    log.info("time elapsed" + timeElapsed)
    //Log some other Service useful info
 }

 @Around("repository() ")
 public Object logAround(final ProceedingJoinPoint joinPoint) throws Throwable {
    log.info("time elapsed" + timeElapsed)
    //Log some other Repository useful info
 }

我将无法跟踪每个请求的日志,因为一次可能会发生多个并发请求。 我正在将SLF4J与lombok实现一起使用,但是我想我可以切换到SLF4J的任何其他实现,例如log4j,如果它对我想要的有所不同。 我希望每个请求都有一个单行日志。

1 个答案:

答案 0 :(得分:1)

跟踪每个请求的时间。

  • 通过如下更改日志格式来添加线程ID作为日志记录的一部分
    每个请求的线程ID都是唯一的

    %d%-5level [%thread] [%logger {36}]:%msg%n%rEx

  • 在记录每个层的时间性能时,请将性能日志重定向到单独的文件。