我正在尝试在 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 配置正确,但它仅包含标头,没有来自标记方法的统计信息。
我的主要问题是 AspectJ 配置应该在 Intellij 中的什么位置,我已将 aop.xml 包含在 src 文件夹中手动创建的 META-INF 文件夹下,但我不确定 AspectJ 是否检测到这一点。
提前致谢
更新
自从我的第一篇文章以来,我在这方面取得了一些进展,特别是引入了两个更改:i) 包含 -javaagent:lib\aspectjweaver.jar ii) 将 aop.xml 移动到 META-INF 文件夹中。现在正在提取 aop 配置,因为它记录了配置详细信息,并且还提到了正在分析的方法。现在的问题是被分析的线程崩溃,它没有记录任何异常,但通过调试,该问题似乎与尝试实例化 org.aspectj.runtime 时 org.aspectj.runtime.reflect.Factory 中的 ClassNotFoundException 有关。反射.JoinPointImpl。
为了隔离问题,我删除了 aspectJ 的所有 maven 导入并使用了安装包提供的 jar,但问题仍然存在,而且应用程序在没有任何日志记录的情况下崩溃的事实也使得问题跟踪变得更加困难。
更新
澄清:
- 在阅读了有关此内容的更多信息后,包括返回链接中的手册(谢谢),我意识到我正在混淆加载时间/编译时间方法。从那时起,我尝试了指南中描述的两种方法,但结果与我之前的更新中描述的结果相同。
- 如上所述,我确实使用 aspectj weaver 选项(-javaagent)启动应用程序
- 构建是通过 IDE 完成的,如上所述,目前我已经从 Maven 中删除了 aspectj / perf4j 依赖项并链接到本地 jar
- 如前所述,aop.xml 确实如更新中所述被拾取,没有错误或警告,只是确认编织方法