2017-06-18 129 views
2

我正在尝试基于此帖子实现性能日志记录:http://www.baeldung.com/spring-performance-logging。我想记录每个控制器端点和每个数据库请求。如果你想看到完整的项目,你可以找到它here。当我击中端点时,没有记录。在拦截器类中放置一个断点也不会停止。我已经将包的日志记录设置为跟踪级别。我错过了什么?我相信这是@PointCut的东西,但看过文档后,我相信我是正确的。使用Spring Boot和AOP进行性能日志记录

拦截

public class PerformanceMonitorInterceptor extends AbstractMonitoringInterceptor 
{ 
    @Override 
    protected Object invokeUnderTrace(MethodInvocation methodInvocation, Log log) throws Throwable 
    { 
     String name = createInvocationTraceName(methodInvocation); 
     StopWatch stopWatch = new StopWatch(); 
     stopWatch.start(); 
     log.trace(String.format("Method %s execution start at %s", name, LocalDateTime.now())); 

     try 
     { 
      return methodInvocation.proceed(); 
     } 
     finally 
     { 
      stopWatch.stop(); 
      log.trace(String.format("Method %s execution took %dms (%s)", name, 
       stopWatch.getTotalTimeMillis(), DurationFormatUtils 
        .formatDurationWords(stopWatch.getTotalTimeMillis(), true, true))); 
     } 
    } 
} 

配置

@Configuration 
@EnableAspectJAutoProxy 
@Aspect 
public class ContactControllerPerfLogConfig 
{ 
    @Bean 
    public PerformanceMonitorInterceptor performanceMonitorInterceptor() 
    { 
     return new PerformanceMonitorInterceptor(); 
    } 

    // Any public method on the ContactController 
    @Pointcut("execution(public * org.example.phonebookexample.app.contact.ContactController.*(..))") 
    public void contactControllerMonitor() 
    { 
    } 

    @Bean 
    public Advisor contactControllerMonitorAdvisor(
     PerformanceMonitorInterceptor performanceMonitorInterceptor) 
    { 
     AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); 
     pointcut.setExpression("org.example.phonebookexample.app.contact.ContactControllerPerfLogConfig.contactControllerMonitor()"); 
     return new DefaultPointcutAdvisor(pointcut, performanceMonitorInterceptor); 
    } 
} 
+0

你有没有在'application.properties'中指定任何日志记录属性? –

+0

是的,他们被设置在跟踪级别 – ndrone

+0

你有没有试图改变它只:'logging.level = trace'? –

回答

1

AbstractTraceInterceptor实现MethodInterceptor和具有其invoke()方法实施如下:

public Object invoke(MethodInvocation invocation) throws Throwable { 
    Log logger = getLoggerForInvocation(invocation); 
    if (isInterceptorEnabled(invocation, logger)) { 
     return invokeUnderTrace(invocation, logger); 
    } 
    else { 
     return invocation.proceed(); 
    } 
} 

因此,Interceptor类的记录器需要设置为TRACE。对于基本的PerformanceMonitorInterceptor,那将是org.springframework.aop.interceptor.PerformanceMonitorInterceptor。由于您已经编写了自己的拦截器,因此您必须为自己的类设置日志记录级别。 查看JamonPerformanceMonitorInterceptor查看替代方法的示例,如果需要,可以跟踪所有调用,而不管日志级别如何。

为了完整起见,我还会发布一个xml配置的例子,因为当它涉及到AOP,的Spring Java CONFIGS相比,XML CONFIGS不那么优雅:

<bean id="performanceMonitorInterceptor" class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/> 

<aop:config> 
    <aop:pointcut id="contactControllerMonitor" expression="execution(public * org.example.phonebookexample.app.contact.ContactController.*(..))" /> 
    <aop:advisor id="contactControllerMonitorAdvisor" pointcut-ref="contactControllerMonitor" advice-ref="performanceMonitorInterceptor"/> 
</aop:config> 

这个配置可以导入到你的java配置如下:

@ImportResource("classpath:/aop-config.xml") 
public class MainConfig { ... } 
+0

是的,就是这样,需要为我的自定义拦截器设置“TRACE”级别。但我不同意java配置不像xml那么优雅。 – ndrone