intellij で perf4j アノテーションを有効にしようとしていますが、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 が正しく構成されていることを示唆していますが、ヘッダーのみが含まれており、タグ付けされたメソッドからの統計は含まれていません。
私が持っている主な質問は、Intellij 内で AspectJ 構成をどこに置くべきかということです。src フォルダーに手動で作成された META-INF フォルダーの下に aop.xml を含めましたが、これが AspectJ によってまったく検出されるかどうかはわかりません。
前もって感謝します
アップデート
最初の投稿以来、これに関していくらかの進歩を遂げました。具体的には 2 つの変更を導入しました。aop 構成は、構成の詳細をログに記録し、プロファイリングされているメソッドについても言及しているため、現在ピックアップされています。問題は、プロファイリングされているスレッドがクラッシュすることです。例外はログに記録されませんが、デバッグを介して、org.aspectj.runtime をインスタンス化しようとすると、org.aspectj.runtime.reflect.Factory の ClassNotFoundException に関連しているように見えます。 Reflect.JoinPointImpl.
問題を特定するために、aspectJ の Maven インポートをすべて削除し、インストール パッケージによって提供される jar を使用しましたが、問題は解決しません。また、アプリケーションがログなしでクラッシュするという事実により、問題の追跡が難しくなります。
アップデート
明確にするために:
- ウェイバックリンクのマニュアルを含め、これについて詳しく読んだ後(ありがとう)、ロード時/コンパイル時のアプローチを混同していることに気付きました。それ以来、ガイドに記載されているように両方の方法を試しましたが、以前の更新で説明したのと同じ結果になりました。
- 上記のように、aspectj ウィーバー オプション (-javaagent) を使用してアプリケーションを起動します。
- 上記のように、ビルドはIDE経由で行われます。現時点では、Mavenからaspectj / perf4jの依存関係を削除し、ローカルjarにリンクしています
- 前述のように、aop.xml は更新で述べたように取得され、エラーや警告はなく、織り方の確認のみが行われます