Аспекты Spring Boot Logger

У меня возникают проблемы с получением моего аспекта ведения журнала для регистрации информации при доступе к методам из классов определенного пакета. Другими словами, ведение журнала «не происходит». Я даже отчаялся и добавил операторы System.out.println, но безуспешно.

Все мои классы расположены в пакете org.my.package, то есть org.my.package.controller, org.my.package.model и т. д.

Вот мой класс приложения:

package org.my.package;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@ComponentScan(basePackages = {"org.my.package.config"})
@EnableAutoConfiguration
@EnableAspectJAutoProxy
public class FirstWebAppApplication {

    public static void main(String[] args) {
        SpringApplication.run(FirstWebAppApplication.class, args);
    }
}

Это мой класс конфигурации:

package org.my.package.config;

import org.deloitte.javatraining.daythree.utilities.MyLogger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = {"org.my.package.utilities"})
public class AssetConfig {

    //-----------------------------------------------------------------------------------------------------------------------
    @Bean   
    public MyLogger myLogger(){
       return new MyLogger();
    }
}

Это мой класс Aspect:

package org.my.package.utilities;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyLogger {

    /** Handle to the log file */
    private final Log log = LogFactory.getLog(getClass());

    public MyLogger () {}

    @AfterReturning("execution(* org.my.package.*.*(..))")
    public void logMethodAccessAfter(JoinPoint joinPoint) {
        log.info("***** Completed: " + joinPoint.getSignature().getName() + " *****");
        System.out.println("***** Completed: " + joinPoint.getSignature().getName() + " *****");
    }

    @Before("execution(* org.my.package.*.*(..))")
    public void logMethodAccessBefore(JoinPoint joinPoint) {
        log.info("***** Starting: " + joinPoint.getSignature().getName() + " *****");
        System.out.println("***** Starting: " + joinPoint.getSignature().getName() + " *****");
    }
}

Это мои зависимости сборки Gradle:

dependencies {
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile('com.h2database:h2:1.3.156')
    compile('javax.servlet:jstl:1.2')
    compile('org.springframework.boot:spring-boot-starter-aop')
    providedRuntime("org.apache.tomcat.embed:tomcat-embed-jasper")
    testCompile("org.springframework.boot:spring-boot-starter-test") 
}

Я что-то упустил или неправильно настроил свой класс Aspect? Я не могу найти ничего плохого после проверки с помощью других похожих вопросов о переполнении стека и онлайн-учебников.

Пожалуйста, порекомендуйте.


person Rick    schedule 19.05.2015    source источник
comment
В настоящее время вы сопоставляете только методы классов в org.my.package не подпакетах. Возможно, вам нужно execution( * org.my.package..*.*(..)) обратить внимание на .. вместо ..   -  person M. Deinum    schedule 20.05.2015
comment
лицо-ладонь Спасибо!! Вот оно. Пожалуйста, ответьте с ответом, чтобы я мог отдать вам должное за этот вопрос.   -  person Rick    schedule 20.05.2015


Ответы (1)


Ваш точечный разрез, execution( * org.my.package.*.*(..)), соответствует только выполнению методов в классах в пакете org.my.package, а не в подпакетах.

Возможно, вам нужно execution( * org.my.package..*.*(..)) обратить внимание на .. вместо ..

person M. Deinum    schedule 20.05.2015