2015-12-18 59 views
1

嗨我嘗試添加調試點到我的javaagent。我有兩個單獨的類,用於前置方法和變換方法。按預期添加的代理類的日誌打印。但在ClassFileTransformer類中,它會打印一些日誌行並忽略其他一些日誌行。 (例如:原木在catch塊,在方法中在同一個類)一些日誌不打印在Javaagent

InstClassTransformer.java

public class InstClassTransformer implements ClassFileTransformer { 
    private static final Log log = LogFactory.getLog(InstClassTransformer.class); 

    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, 
      ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { 
     if(log.isDebugEnabled()){ 
      log.debug("Loading class : "+className.replace('/','.')); //log 1 
     } 
     ByteArrayInputStream currentClass = null; 
     CtClass ctClass = null; 
     byte[] transformedBytes = classfileBuffer; 
     try { 
      ClassPool classPool = ClassPool.getDefault(); 
      currentClass = new ByteArrayInputStream(classfileBuffer); 
      ctClass = classPool.makeClass(currentClass); 
     instrumentClass(ctClass, baseClass.getName()); 
      } 
      transformedBytes = ctClass.toBytecode(); 
     } catch (NotFoundException e) { 
      if(log.isDebugEnabled()){ 
       log.debug("Unable to find "+ className.replace('/','.') + "for instrumentation : "+ e.getMessage()); //log2 
      } 
     } catch (CannotCompileException | IOException e) { 
      if(log.isDebugEnabled()){ 
       log.debug("Intrumentation of " + className.replace('/', '.') + "failed : " + e.getMessage()); //log3 
      } 
     } finally { 
      if (currentClass != null) { 
       try { 
        currentClass.close(); 
       } catch (IOException e) { 
        if(log.isDebugEnabled()){ 
         log.debug("Failed to close the connection : " + e.getMessage()); 
        } 
       } 
      } 
      if(ctClass != null){ 
       ctClass.detach(); 
      } 
     } 
     return transformedBytes; 
    } 

    public void instrumentClass(CtClass ctClass, String name) throws NotFoundException, CannotCompileException { 
     if(log.isDebugEnabled()){ 
      log.debug("Instrumenting " + ctClass.getName()); //log4 
     } 
    CtMethod[] method = ctClass.getDeclaredMethods(); 
     ... 
    } 

當我啓動代理它打印用於每個類別它負載LOG1和日誌2有些類無法找到。但它不打印log3。我可以保證該catch塊正在達到,因爲有兩種情況下它被擊中。當我添加e.printStackTrace它打印跟蹤,但同時它不打印日誌。它也不打印log4。但是如果我爲這個instrumentClass()方法添加打印語句,它會打印在控制檯上,而不是日誌。

另一件事,即使它打印來自ClassFileTransformer的日誌,它說,沒有appender可以找到相同的類。

log4j:WARN No appenders could be found for logger (org.wso2.das.javaagent.instrumentation.InstrumentationClassTransformer). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

我正在使用log4j進行日誌記錄。我的log4j.properties文件,

log4j.rootLogger=DEBUG, file 
log4j.appender.file=org.apache.log4j.FileAppender 
log4j.appender.file.append=true 
log4j.appender.file.file=/path/to/testLog/log4j-application-1.log 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss},%r] %-5p {%c} - %m%n 

log4j.logger.org.javaagent.instrumentation = DEBUG

這是某種javaagent的行爲還是我失去了一些東西。

回答

0

No appenders could be found for logger這裏沒有問題。

這裏可能引發了javassist的一個異常。用try catch塊封裝該方法,並捕獲Throwable而不是Exception。我想這會幫助你解決問題。