我正在使用Spring AOP登录我的应用程序。这是applicationContext.xml文件
<mvc:annotation-driven />
<context:component-scan base-package="com.template" />
<context:annotation-config />
<jpa:repositories base-package="com.template.repository"/>
<tx:annotation-driven />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/template?autoReconnect=true"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
<property name="persistenceUnitName" value="template"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
我的aopLogging.xml是
<bean id="aopLogging" class="com.template.log.AopLoggingAspect" />
<aop:aspectj-autoproxy proxy-target-class="false"/>
我的Aspect类是
import org.apache.log4j.Logger;
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;
@Aspect
@Component
public class AopLoggingAspect {
private static final Logger logger = Logger.getLogger(AopLoggingAspect.class);
@Around(value="@annotation(com.template.log.Loggable)")
public Object logAround(final ProceedingJoinPoint joinPoint) throws Throwable{
Object retVal = null;
try {
StringBuffer startMessageStringBuffer = new StringBuffer();
startMessageStringBuffer.append("Start method execution :: ");
startMessageStringBuffer.append(joinPoint.getSignature().getName());
startMessageStringBuffer.append("(");
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
startMessageStringBuffer.append(args[i]).append(",");
}
if (args.length > 0) {
startMessageStringBuffer.deleteCharAt(startMessageStringBuffer.length() - 1);
}
startMessageStringBuffer.append(")");
logger.info(startMessageStringBuffer.toString());
StopWatch stopWatch = new StopWatch();
stopWatch.start();
retVal = joinPoint.proceed();
stopWatch.stop();
StringBuffer endMessageStringBuffer = new StringBuffer();
endMessageStringBuffer.append("Finish method ");
endMessageStringBuffer.append(joinPoint.getSignature().getName());
endMessageStringBuffer.append("(..); execution time: ");
endMessageStringBuffer.append(stopWatch.getTotalTimeMillis());
endMessageStringBuffer.append(" ms;");
logger.info(endMessageStringBuffer.toString());
} catch(Exception ex) {
StringBuffer errorMessageStringBuffer = new StringBuffer();
logger.error(errorMessageStringBuffer.toString(), ex);
throw ex;
}
return retVal;
}
}
我的自定义注释是
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Loggable {
}
我的服务类是
public class UserService {
@Transactional(readOnly=true)
@Loggable
public User getUserByUserId(Long userId){
return userRepository.findOne(userId);
}
}
问题是日志没有打印出来。请帮我。提前致谢。如果需要任何其他信息,请告诉我。
答案 0 :(得分:0)
在我看来,您忘记在applicationContext.xml
文件中导入aopLogging.xml
文件。尝试将其添加到applicationContext.xml
文件中:
<!-- Import your AspectJ config -->
<import resource="classpath:aopLogging.xml" />
答案 1 :(得分:0)
这不完全是你所要求的,但它可能有用。我实现了一个增强的aop记录器。它具有您需要的功能和许多其他功能。见https://github.com/nickvl/aop-logging
PS 根据spring版本和整个应用程序上下文,尝试在aopLogging.xml中为类切换代理是值得的:
<aop:aspectj-autoproxy proxy-target-class="true"/>
答案 2 :(得分:0)
试试这个..
<强> @Around(值= “@注解(可记录的)”)强> public Object logAround(final ProceedingJoinPoint joinPoint)抛出Throwable {
答案 3 :(得分:0)
创建注释
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)public @interface LogExecutionTime {}
然后是一个方面
@Aspect
@Component
公共类LoggingAspect {
然后是Aspect中的方法
@Around( “@注解(LogExecutionTime)”)
公共对象 logExecutionTime(ProceedingJoinPoint joinPoint)抛出Throwable {long start = System.currentTimeMillis(); Object proceed = joinPoint.proceed(); long executionTime = System.currentTimeMillis() - start; LOGGER.info(joinPoint.getSignature() + " executed in " + executionTime + "ms"); return proceed; }
然后使用Annotation Anywhere
@PostMapping(值= “/注册”)
@LogExecutionTime
public @ResponseBody ResponseObject寄存器(用户用户){ }