2015-04-04 54 views
0

我正在使用spring aop爲我的應用程序執行日誌記錄: 之前我已經配置好了後續的建議,但我看到的行號不是目標類,而是用於類的類登錄 我怎樣才能解決這個 下面是我的配置Spring Aop日誌行數不正確

的Spring XML:

package com.digilegal.services.ahc.logging; 

import java.lang.reflect.Modifier; 
import org.apache.log4j.Logger; 
import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.AfterThrowing; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.reflect.MethodSignature; 
import org.springframework.core.Ordered; 
import org.springframework.core.annotation.Order; 

@Aspect 
public class AHCLogging { 

    @Before("execution(* com.digilegal.services..*.*(..))") 
    public void logBefore(JoinPoint joinPoint) { 

     Logger log = Logger.getLogger(joinPoint.getTarget().getClass()); 
     MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 

     if (!Modifier.isPrivate(signature.getModifiers()) 
       && !signature.getName().startsWith("get") 
       && !signature.getName().startsWith("set") 
       && !signature.getName().startsWith("is")) { 
      log.trace("ENTER METHOD ::" 
        + signature.getReturnType().getSimpleName() + " " 
        + signature.getName() + "(" 
        + paramterType(signature.getParameterTypes()) + ")"); 
     } 

    } 

    @After("execution(* com.digilegal.services..*.*(..))") 
    public void logAfter(JoinPoint joinPoint) { 
     Logger log = Logger.getLogger(joinPoint.getTarget().getClass()); 
     MethodSignature signature = (MethodSignature)  joinPoint.getSignature(); 

     if (!Modifier.isPrivate(signature.getModifiers()) 
       && !signature.getName().startsWith("get") 
       && !signature.getName().startsWith("set") 
       && !signature.getName().startsWith("is")) { 
      log.trace("EXIT METHOD ::" 
        + signature.getReturnType().getSimpleName() + " " 
        + signature.getName() + "(" 
        + paramterType(signature.getParameterTypes()) + ")"); 
     } 
    } 

    @AfterThrowing(pointcut = "execution(* com.digilegal.services..*.*  (..))",throwing= "error") 
    public void logAfterThrowing(JoinPoint joinPoint, Throwable error) { 
     Logger log = Logger.getLogger(joinPoint.getTarget().getClass()); 
     MethodSignature signature = (MethodSignature)  joinPoint.getSignature(); 

     if (!Modifier.isPrivate(signature.getModifiers()) 
       && !signature.getName().startsWith("get") 
       && !signature.getName().startsWith("set") 
       && !signature.getName().startsWith("is")) { 
      log.error("EXCEPTION IN METHOD ::" 
        + signature.getReturnType().getSimpleName() + " " 
        + signature.getName() + "(" 
        + paramterType(signature.getParameterTypes()) + ")"); 
      log.error("Exception",error); 
     } 
    } 

    private String paramterType(Class<?>[] classes) { 
     StringBuffer buffer = new StringBuffer(); 
     String returnValue = ""; 

     for (Class<?> string : classes) { 
      buffer.append(Modifier.toString(string.getModifiers())); 
      buffer.append(" "); 
      buffer.append(string.getSimpleName()); 
      buffer.append(","); 
     } 

     returnValue = buffer.toString(); 

     if (returnValue.trim().length() > 0) { 
      returnValue = returnValue.substring(0, returnValue.length() -   1); 
     } 

     return returnValue; 
    } 
} 
:用於記錄

<aop:aspectj-autoproxy proxy-target-class="false" /> 

我缺少的東西,或者它想是這樣

感謝

Nirav

+0

沒有什麼在那裏提的行數,所以我不確定你在問什麼。你也知道春天已經有一個類可以爲你記錄這些東西(而不是添加你自己的東西?)。檢查['CustomizableTraceInterceptor'](http://docs.spring.io/autorepo/docs/spring/current/javadoc-api/org/springframework/aop/interceptor/CustomizableTraceInterceptor.html) – 2015-04-04 08:45:14

+0

非常感謝您指出春季班,它會幫助很多,但我說的事情是這樣的:2015年4月4日15:25:08:775 TRACE LoginBean:30 - 輸入方法:void doLogin(public ActionEvent)其中30是行號記錄類,而不是LoginBean – nirav 2015-04-04 09:55:23

回答

5

我想,這是不是專門Spring AOP的問題,但只是Log4j的工作方式,看到的Javadoc PatternLayout

大號

使用輸出發出記錄請求的行號

警告生成呼叫者位置信息非常緩慢,應該避免,除非執行速度不是問題。

所以我的建議是使用的圖案佈局沒有行號,並使用確定的行號的Spring AOP的能力,大致是這樣的:

joinPoint.getSourceLocation().getLine() 
+0

嗨Kriegaex,謝謝這有助於 – nirav 2015-04-06 04:59:19

+1

好吧,如果是這樣,請接受並upvote我的答案。 – kriegaex 2015-04-06 09:28:59

+1

Spring-AOP不支持該方法'joinPoint.getSourceLocation()。getLine()',最高支持4.2.2。 '線程中的異常「main」java.lang.UnsupportedOperationException' – Tim 2015-10-22 19:52:02