Невозможно добавить журнал с AspectJ для каждого метода JDK6 и Spring 4.0.6.RELEASE

У меня есть старое приложение, использующее java 6 и Spring 4.0.6.

У меня много проблем с добавлением журнала с помощью log4j, журнал никогда ... не регистрируется. Поэтому я использую в коде только System.out.println, и он отлично работает, все журналы перенаправляются в файл server.log.

Я хотел автоматически добавить журнал для отслеживания каждого вызова каждого метода. Поэтому я добавляю это в свой pom.xml:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.9</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.9</version>
    </dependency>

Я создаю класс Aspect:

package com.al6.business.log;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;

@Component
@Aspect
public class MyAspect {

    private final Log log = LogFactory.getLog(this.getClass());
    
    @Around("execution(* com.al6.business.commande.CommandeBusiness.*(..))")
    public void logAroundAllMethods(ProceedingJoinPoint joinPoint) throws Throwable 
    {
        log.info("Test with logger");
        System.out.println("****LoggingAspect.logAroundAllMethods() : " + joinPoint.getSignature().getName() + ": Before Method Execution");
        try {
            joinPoint.proceed();
        } finally {
            //Do Something useful, If you have
        }
        System.out.println("****LoggingAspect.logAroundAllMethods() : " + joinPoint.getSignature().getName() + ": After Method Execution");
    }


}

И в моем файле xml beans я добавляю:

<?xml version="1.0"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx" 
 xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

  <aop:aspectj-autoproxy/>
  
 
  <bean id="tracerInvocation" class="com.al6.business.log.MyAspect">
  
  </bean>

...


</beans>

И вот пример кода, который мне нужно отслеживать:

package com.al6.business.commande;

import ...
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Subqueries;

import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;


    /**
     * Manages order business service
     *
     */
    public class CommandeBusiness extends MainBusinessService implements ICommandeService, ITransfertService {
    
    
    @Override
    public void creerEnteteCommande(Commande commande, String idCommandeAPurger, Utilisateur utilisateur) {
        System.out.println("creerEnteteCommande " + commande.getId() + " par " + utilisateur + " Type doc : " + commande.getTypeDocument());
        ...
    }
...
}

В моем файле server.log Sysout в методе регистрируется правильно, но моего журнала аспектов здесь нет...:

2021-04-28 18:03:25,565 INFO  [STDOUT] creerEnteteCommande 81797581 par UTILISATEUR SUPER (admindsi) Type doc : CC

Если я ищу Aspect в server.log, я вижу:

2021-04-28 17:04:24,563 INFO  [STDOUT] 989  [ajp-0.0.0.0-8009-2] DEBUG org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory  - Found AspectJ method: public java.lang.Object com.al6.business.log.MyAspect.logAroundAllMethods(org.aspectj.lang.ProceedingJoinPoint) throws java.lang.Throwable

Так почему моих логов нет? У меня есть файл jboss-log4j.xml на сервере, может ли конфигурация сделать журнал аспекта неэффективным?

Спасибо


person user2178964    schedule 28.04.2021    source источник
comment
Во-первых, ваш pointcut говорит com.al6.business.commande.CommandeBusiness.*(..), что не соответствует имени пакета com.al6.borneIntranet.business.commande. Во-вторых, после того, как вы это исправили, убедитесь, что CommandeBusiness объявлен как компонент Spring. Spring AOP может перехватывать только компоненты/бины Spring. Если вы хотите перехватывать классы, не управляемые Spring, вам нужно использовать собственный Aspect. Пожалуйста, дайте мне знать, если это поможет, тогда я могу написать ответ, который вы можете принять, чтобы закрыть вопрос, или я закрою вопрос как дубликат.   -  person kriegaex    schedule 29.04.2021
comment
Спасибо. Название пакета правильное, я просто изменил его для публикации своего вопроса, чтобы сделать его более «общим», но я забыл изменить везде в своем сообщении ^^ Да, CommandBusiness не является компонентом. У меня есть около 50 классов Java для просмотра, и ни один из них не является компонентом, я ввожу «компонент» только с этим аспектным классом. Если я добавлю аннотацию компонента везде, я предполагаю, что это не очень хорошее решение, поэтому, когда вы говорите «использовать нативный аспект», что вы хотите сказать? Спасибо   -  person user2178964    schedule 29.04.2021
comment
Я хотел сказать родной AspectJ, автокоррекция моего смартфона стерла J, извините. Следуйте ссылкам на документацию Spring в ответе, с которым я связал этот дубликат, для получения дополнительной информации. Вот соответствующие ссылки на устаревшую документацию 4.0.6 для Spring AOP и встроенная поддержка AspectJ в Spring.   -  person kriegaex    schedule 29.04.2021
comment
Хорошо, спасибо, когда я прочитал: docs.spring.io/spring-framework/docs/current/reference/html/ Кажется, что необходимо изменить фактические классы Java, чтобы заставить его работать. Итак, в моем случае, если я не хочу касаться бизнес-классов Java, мне кажется, что мне нужно это: docs.spring.io/spring-framework/docs/current/reference/html/ Верно?   -  person user2178964    schedule 29.04.2021
comment
Вам вообще не нужно менять классы, как вы пришли к этой идее? AspectJ будет вплетать аспекты в байт-код при загрузке классов. Это намного эффективнее, чем Spring AOP. Вам не нужны прокси, и у вас есть гораздо больше возможностей для модификации. По сравнению с Spring AOP это просто AOP lite. AspectJ очень зрелый и готовый к работе на предприятиях, с Spring или без него. Даже руководство Spring рекомендует его, если вам нужно больше, чем может предложить Spring AOP.   -  person kriegaex    schedule 29.04.2021
comment
Хорошо, я почти добился успеха, теперь у меня есть эта ошибка: Вызвано: java.lang.IllegalStateException: ClassLoader [org.jboss.mx.loading.UnifiedClassLoader3] НЕ предоставляет метод «addTransformer (ClassFileTransformer)». Укажите пользовательский LoadTimeWeaver или запустите виртуальную машину Java с агентом Spring: -javaagent:org.springframework.instrument.jar   -  person user2178964    schedule 29.04.2021
comment
Если вы прочитали руководство и настроили систему в соответствии с описанием, но проблема осталась, задайте новый вопрос, подробно объясните ситуацию и сообщение об ошибке, а также предоставьте MCVE либо в вопросе, либо в идеале в виде ссылки на репозиторий GitHub. Спасибо.   -  person kriegaex    schedule 29.04.2021
comment
Спасибо, я просто делаю это здесь: stackoverflow.com/questions /67325255/   -  person user2178964    schedule 30.04.2021