Некоторые журналы не печатаются в Javaagent

Привет, я пытаюсь добавить точки отладки в свой javaagent. У меня есть два отдельных класса для метода premain и метода преобразования. Журналы, добавленные для класса агента, печатаются должным образом. Но в классе ClassFileTransformer он печатает некоторые строки журнала и игнорирует некоторые другие. (Например: регистрируется в блоке catch внутри метода того же класса)

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();
        ...
    }

Когда я запускаю агент, он печатает журнал 1 для каждого класса, который он загружает, и журнал 2 для некоторых классов, которые он не может найти. Но он не печатает log3. Я могу гарантировать, что блок catch будет достигнут, потому что есть две ситуации, когда он попадает. Когда я добавляю e.printStackTrace, он печатает трассировку, но в то же время не печатает журнал. Он также не печатает log4. Но если я добавлю оператор печати для этого метода instrumentClass(), он будет напечатан на консоли, но не в журнале.

Другое дело, что даже если он печатает журналы из ClassFileTransformer, он говорит, что для того же класса не найдены приложения.

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=ОТЛАДКА

Это какое-то поведение javaagent или я что-то упустил.


person udani    schedule 18.12.2015    source источник


Ответы (1)


No appenders could be found for logger здесь не проблема.

Вероятно, здесь выбрасывается исключение из javassist. Оберните метод блоком try catch и поймайте Throwable, а не Exception. Я думаю, это поможет вам, в чем проблема.

person Halil    schedule 13.12.2016