如何使用AspectJ和log4j创建原始日志行号?

时间:2011-07-12 03:25:13

标签: java spring log4j aop

如何使用AspectJ(Spring)框架记录我的方法的原始行号?我是aop编程的新手,所以我只想知道它是否可行或如何?由于aop将委托我的方法的调用过程,它生成新类和新方法,所记录的行号始终不是原始行。

以下是我的一些代码:

基于模式的aop配置:

<bean id="logInterceptor" class="com.fuhu.appsub.aop.LogInterceptor"></bean>
<aop:config>
    <aop:aspect id="logDBAspect" ref="logInterceptor">
    <aop:pointcut id="logDBPointcut" expression="execution(*            com.fuhu.appsub.service..*(..)) " />
        <aop:after-throwing  pointcut-ref="logDBPointcut" throwing="ex" method="logDBException"/>           
    </aop:aspect>
</aop:config>

这是我委托的方法:

@Transactional(propagation=Propagation.REQUIRED, readOnly=true)
public List<Item> findByName (String name) throws Exception{
    try
    {
        List<Item> itemList = itemRepository.findByName(name);
        int i=0,j=1;
        int k = j/i;
        return itemList;
    }
    catch(Exception ex)
    {
        throw new Exception(ex.getMessage() + "in findByName with name=" + name + "  file:" + Thread.currentThread().getStackTrace()[2].getFileName() + "  line:" + Thread.currentThread().getStackTrace()[2].getLineNumber());
    }
}

这是我的委派方法:

 public void logDBException( JoinPoint joinPoint, Exception ex) {
         if(loggerDB.isErrorEnabled()){
             loggerDB.error(ex.getMessage());
         }
  }

2 个答案:

答案 0 :(得分:1)

您使用的是full AspectJ or just Spring's AOP吗? Java is primarily based上的Spring AOP dynamic proxies。它通常足以满足您的需求,它非常简单,并且它根本不会干扰堆栈跟踪行数。

答案 1 :(得分:1)

即使是真正的AspectJ也不会改变原始代码的行号。

这是因为类文件中的行号存储在行号表中。此表允许它在一个“行”中包含多个语句。因此,即使额外的AOP调用也不得更改行号。