2015-05-20 14 views
0

我正在使用Spring AOP進行日誌記錄,其中我想記錄包中所有方法的輸入/輸出。我已經爲目標包編寫了以下切入點。編寫精確的切入點表達式

@Pointcut("within(com.mypackage.model.*)") 
public void allmethods(){}; 

我的記錄方法如下。

@Before("allmethods()") 
    public void LoggingAdviceBefore(JoinPoint joinPoint) 
    { 
     StringBuffer logMessage = new StringBuffer(); 
     if(joinPoint != null && joinPoint.getTarget()!=null && joinPoint.getTarget().getClass()!=null) 
     { 
      logMessage.append(joinPoint.getTarget().getClass().getName()); 
      logMessage.append("."); 
      logMessage.append(joinPoint.getSignature().getName()); 
      logMessage.append("("); 
      // append args 
      Object[] args = joinPoint.getArgs(); 
      for (int i = 0; i < args.length; i++) { 
       logMessage.append(args[i]).append(","); 
      } 
      if (args.length > 0) { 
       logMessage.deleteCharAt(logMessage.length() - 1); 
      } 

      logMessage.append(")"); 
      log.info(logMessage.toString()); 
     } 

    } 

該代碼工作正常。

我的問題是,即使我做了一些簡單的操作,例如在我的代碼中填充數組列表,即使該信息正在記錄。我不希望這些信息被記錄下來。

我想記錄輸入只用於我寫在目標包&中的類中寫入的方法,而不是寫入這些方法內的代碼。我如何實現這一目標?

+0

AspectJ文檔中充滿了更多限制性切入點規範的示例。你讀過了嗎? – slim

+0

我做了一個基本的搜索,但沒有得到我想要的。你能建議一個好的網站來提高我的知識嗎? –

+0

https://www.eclipse.org/aspectj/doc/released/progguide/ – slim

回答

0

你可以使用我已經寫了幾個月的下面的代碼來理解SNMP框架的實現,它打印包和子包中所有方法的I/O,你可以刪除不相關的類並根據需要修改,如果需要的話。

@Aspect 
public class Snmp4JProfiler { 

    private static final Logger LOG = LoggerFactory.getLogger(Snmp4JProfiler.class); 

    @Pointcut("execution (* org.snmp4j.Snmp.*(..))") 
    public void allSnmpServices() { 
    } 

    @Pointcut("execution (* org.snmp4j.security.U*.*(..))") 
    public void allUSMServices() { 
    } 

    @Around("allUSMServices() || allSnmpServices()") 
    public Object executionTimeOfService(ProceedingJoinPoint pjp) throws Throwable { 

     MethodSignature methodSignature = (MethodSignature) pjp.getSignature(); 
     String className = pjp.getSignature().getDeclaringTypeName(); 
     final String methodName = methodSignature.getName(); 


     String methodArgs = ""; 
     for (Object obj : pjp.getArgs()) { 

      if (obj == null) { 
       methodArgs += "no args or null,"; 
      } else if (obj instanceof UsmTimeEntry) { 
       UsmTimeEntry timeEntry = (UsmTimeEntry) obj; 
       methodArgs += obj.toString() + "[" + timeEntry.getEngineBoots() + "," + timeEntry.getLatestReceivedTime() + "," 
         + timeEntry.getTimeDiff() + "," + timeEntry.getEngineID() + "]"; 
      } else if (obj instanceof Object[]) { 
       methodArgs += obj.toString() + " " + Arrays.toString((Object[]) obj); 
      } else { 
       methodArgs += obj; 
      } 

     } 

     LOG.info("Start of method#" + methodName + " #class#" + className + " #args#" + methodArgs); 

     try { 
      Object output = pjp.proceed(); 

      String rtValues = ""; 
      if (output == null) { 
       rtValues += "no args or null,"; 
      } else if (output instanceof UsmTimeEntry) { 
       UsmTimeEntry timeEntry = (UsmTimeEntry) output; 
       rtValues += output.toString() + "[" + timeEntry.getEngineBoots() + "," + timeEntry.getLatestReceivedTime() + "," 
         + timeEntry.getTimeDiff() + "," + timeEntry.getEngineID() + "]"; 
      } else if (output instanceof Object[]) { 
       rtValues += output.toString() + " " + Arrays.toString((Object[]) output); 
      } else { 
       rtValues += output; 
      } 

      LOG.info("End of method#" + methodName + " #class#" + className + " #return#" + rtValues); 
      return output; 
     } catch (Exception ex) { 
      LOG.info("End of method#" + methodName + " #class#" + className + " #error#" + ex.getMessage()); 
      throw ex; 
     } 

    } 

} 
+0

謝謝Karthik,經過一些修改代碼工作後好:) –