Почему не может инструмент Bytebuddy org.slf4j классы? - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь использовать org.slf4j.Logger, чтобы перехватывать вызовы журнала и сохранять их через java-агент. Мой код выглядит следующим образом:

new AgentBuilder.Default()
                .with(new AgentBuilder.InitializationStrategy.SelfInjection.Eager())
                .type(hasSuperType(nameContains("Logger")))
                .transform(new AgentBuilder.Transformer.ForAdvice()
                        .include(Agent.class.getClassLoader())
                        .advice(named("info"), LogAdvice.class.getName()))
                .installOn(inst);

LogAdvice имеет следующий метод:

@Advice.OnMethodEnter
    public static void before(@Advice.This Object obj){
        System.out.println(obj);
        System.out.println("===========ENTERED INFO==========");
    }

Но этот метод никогда не вводится. Мой подход прекрасно работает с другими классами, которые я пробовал, такими как метод put () из java.util.Map. Есть идеи, почему в этом случае не работает контрольно-измерительный прибор?

1 Ответ

0 голосов
/ 26 июня 2019

Зарегистрируйте AgentBuilder.Listener, чтобы увидеть, какие классы инструментированы. Я подозреваю, что класс, который вы ищете, загружается до того, как ваш агент зарегистрирован.

Если это так, вы можете зарегистрировать стратегию ретрансформации для ретрансформации этих классов.

Кстати: я не вижу, насколько полезна здесь активная инициализация. Я не вижу, как для этого требуется какая-либо инициализация инструментированных классов.

...