嗨我嘗試添加調試點到我的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的行爲還是我失去了一些東西。