У меня есть старое приложение, использующее 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 на сервере, может ли конфигурация сделать журнал аспекта неэффективным?
Спасибо
com.al6.business.commande.CommandeBusiness.*(..)
, что не соответствует имени пакетаcom.al6.borneIntranet.business.commande
. Во-вторых, после того, как вы это исправили, убедитесь, чтоCommandeBusiness
объявлен как компонент Spring. Spring AOP может перехватывать только компоненты/бины Spring. Если вы хотите перехватывать классы, не управляемые Spring, вам нужно использовать собственный Aspect. Пожалуйста, дайте мне знать, если это поможет, тогда я могу написать ответ, который вы можете принять, чтобы закрыть вопрос, или я закрою вопрос как дубликат. - person kriegaex   schedule 29.04.2021