AspectJ使用Log4j进行日志记录

时间:2012-08-13 16:06:15

标签: spring aspectj

我正在尝试将AspectJ日志记录实现到模块以更好地分析它。我的应用程序已经在使用log4J框架 如果我在一个单独的应用程序中运行AspectJ类,它工作正常,但是当我将它与应用程序集成时它不起作用。我在这里做了什么 的applicationContext.xml

<aop:aspectj-autoproxy/>
<bean id="logAspectj" class="com.test.aspect.LoggingAspect"/>

LoggingAspect类

@Component
@Aspect
public class LoggingAspect {

    private final Log log = LogFactory.getLog(this.getClass());

    @Around("execution(public void com.db.TestMarshaller.saveDoc(..))")
    public Object logTimeMethod(ProceedingJoinPoint joinPoint) throws Throwable {

            StopWatch stopWatch = new StopWatch();
            stopWatch.start();

            Object retVal = joinPoint.proceed();

            stopWatch.stop();

            StringBuffer logMessage = new StringBuffer();
            logMessage.append(joinPoint.getTarget().getClass().getName());
            logMessage.append(".");
            log.info(logMessage.toString());
            return retVal;
    }

}

注意:此处TestMarshaller不会通过Spring公开。

Log4j是否有一些特定的AspectJ设置?

1 个答案:

答案 0 :(得分:1)

因为你的com.db.TestMarshaller不是“spring managed”(你的上下文中没有那种类型的Spring bean),所使用的spring命名空间将 NOT 创建一个调用你的Aspect的代理

在这种情况下,您必须使用AspectJ编译器(编译时编织)编译源代码,或者在加载类时使用aspectj运行时修改字节码(加载时间编织)。

这实际上取决于您的使用情况 - 如果您的Aspect是业务逻辑的一部分并且在运行时无法更改,请使用aspectj编译器,因为它只会执行一次。我的情况是你需要一个更加动态的方面应用,而是使用加载时间编织。

希望这有帮助, 约亨