Включить профильную аннотацию perf4j в intellij
Я пытаюсь включить аннотации perf4j в intellij, но я пытаюсь правильно настроить AspectJ. В частности, файл журнала создан правильно, но в нем отсутствуют какие-либо данные из аннотированного метода.
Вот соответствующие выдержки конфигурации:
logback.xml
<configuration debug="true">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="statistics" class="ch.qos.logback.core.FileAppender">
<file>./target/statisticsLogback.log</file>
<append>false</append>
<layout>
<pattern>%msg%n</pattern>
</layout>
</appender>
<appender name="coalescingStatistics" class="org.perf4j.logback.AsyncCoalescingStatisticsAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<timeSlice>1000</timeSlice>
<appender-ref ref="statistics"/>
</appender>
<appender name="listAppender" class="ch.qos.logback.core.read.ListAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<timeSlice>1000</timeSlice>
</appender>
<logger name="org.perf4j.TimingLogger" level="info">
<appender-ref ref="coalescingStatistics" />
<appender-ref ref="listAppender"/>
</logger>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
aop.xml
<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
<!--
We only want to weave in the log4j TimingAspect into the @Profiled classes.
Note that Perf4J provides TimingAspects for the most popular Java logging
frameworks and facades: log4j, java.util.logging, Apache Commons Logging
and SLF4J. The TimingAspect you specify here will depend on which logging
framework you wish to use in your code.
-->
<aspects>
<aspect name="org.perf4j.slf4j.aop.TimingAspect"/>
<!-- if SLF4J/logback use org.perf4j.slf4j.aop.TimingAspect instead -->
</aspects>
<weaver options="-verbose -showWeaveInfo">
<!--
Here is where we specify the classes to be woven. You can specify package
names like com.company.project.*
-->
<include within="com.mycode.myproject.mypackage.*"/>
<include within="org.perf4j.slf4j.aop.*"/>
</weaver>
</aspectj>
Наконец, связанный метод тестирования помечается аннотацией @Profiled, это часть пакета, определенного в aop.xml.
Эта конфигурация приводит к созданию файла журнала (что говорит о том, что logback.xml настроен правильно, однако он содержит только заголовки и не содержит статистики из тегового метода.
Главный вопрос, который у меня возник, заключается в том, где конфигурация AspectJ должна находиться в Intellij. Я включил aop.xml в папку META-INF, созданную вручную, в папке src, но я не уверен, что AspectJ вообще это обнаруживает.
заранее спасибо
ОБНОВИТЬ
Я добился некоторого прогресса в этом вопросе со времени моей первой публикации, в частности, внес два изменения: i) включил -javaagent:lib\aspectjweaver.jar ii) переместил aop.xml в папку META-INF. Конфигурация aop теперь выбирается, поскольку в ней регистрируются детали конфигурации, а также упоминается профилируемый метод. Проблема заключается в том, что профилируемый поток аварийно завершает работу, он не регистрирует никаких исключений, но с помощью отладки проблема, по-видимому, связана с ClassNotFoundException в org.aspectj.runtime.reflect.Factory при попытке создания экземпляра org.aspectj.runtime.reflect.JoinPointImpl.
Чтобы изолировать проблему, я удалил все maven импорта aspectJ и использовал файлы jar, предоставляемые установочным пакетом, но проблема сохраняется, а также тот факт, что приложение аварийно завершает работу без какой-либо регистрации, усложняет отслеживание проблемы.
ОБНОВИТЬ
Чтобы уточнить:
- Прочитав больше об этом, включая руководство в ссылке обратного хода (спасибо за это), я понял, что перепутал подход время загрузки / время компиляции. С тех пор я попробовал оба метода, как описано в руководстве, но с теми же результатами, что и в моем предыдущем обновлении.
- Как указано выше, я запускаю приложение с параметром aspectj weaver (-javaagent)
- Сборка выполняется через IDE, как описано выше, в тот момент, когда я удалил зависимости aspectj / perf4j из Maven и связал их с локальными jar-файлами.
- Как уже упоминалось, aop.xml поднимается, как упоминалось в обновлении, без ошибок и предупреждений, только подтверждение метода weaved.
1 ответ
Хорошо, я добавил полный пример Maven в репозиторий GitHub, который вы можете просто клонировать и поиграть.
Некоторые основные вещи для рассмотрения:
- Для ткачества во время компиляции (CTW) вам нужно
aspectjrt.jar
на пути к классам при компиляции и запуске кода. Вам также нужно использовать компилятор AspectJ для сборки проекта, обычного компилятора Java недостаточно. - Для ткачества во время загрузки (LTW) вам нужно
aspectjweaver.jar
в качестве агента Java в командной строке при запуске кода:-javaagent:/path/to/aspectjweaver.jar
, Вам также необходимо добавить его в качестве аргумента виртуальной машины в конфигурацию запуска LTW в IDEA. - Для LTW вам также нужно
META-INF/aop.xml
в вашей папке ресурсов. Также обратите внимание, что для охвата подпакетов вы должны использовать..*
нотация, а не только.*
например,<include within="de.scrum_master..*"/>
,
Вы найдете больше информации в файле read-me моего проекта.
PS: документация Perf4J устарела, а проект не поддерживается. Таким образом, он по-прежнему упоминает AspectJ 1.6.x как необходимые зависимости. Я собрал и запустил все с последней версией AspectJ 1.8.10, и она отлично работает, как от Maven, так и от IDEA.