在 intellij 中启用 perf4j 配置注释
Enable perf4j profiled annotation in intellij
我正在尝试在 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 配置正确,但它仅包含 headers 并且没有来自标记方法的统计信息。
我的主要问题是 AspectJ 配置应该放在 Intellij 中的什么位置,我已经将 aop.xml 包含在 src 文件夹中手动创建的 META-INF 文件夹下,但我不确定这一点完全被 AspectJ 检测到。
提前致谢
更新
自从我最初 post 以来,我在这方面取得了一些进展,具体介绍了两个变化:
i) 包括 -javaagent:lib\aspectjweaver.jar
ii) 将 aop.xml 移动到 META-INF 文件夹中。
现在正在选择 aop 配置,因为它记录了配置详细信息,并且还提到了正在分析的方法。
现在的问题是被分析的线程崩溃了,它没有记录任何异常,但通过调试,这个问题似乎与尝试实例化 org.aspectj.runtime.reflect.JoinPointImpl.[=12= 时 org.aspectj.runtime.reflect.Factory 中的 ClassNotFoundException 有关]
为了隔离问题,我删除了 aspectJ 的所有 maven 导入并使用了安装包提供的 jar,但问题仍然存在,而且应用程序在没有任何日志记录的情况下崩溃这一事实使问题跟踪变得更加困难。
更新
澄清一下:
- 阅读更多相关信息,包括回程中的手册后 link(感谢),我意识到我混淆了 load-time / compile-time 方法。从那时起,我尝试了指南中描述的两种方法,但结果与我之前更新中描述的相同。
- 如上所述,我确实使用 aspectj weaver 选项 (-javaagent) 启动应用程序
- 构建是通过 IDE 完成的,按照上面的说明,目前我已经从 Maven 中删除了 aspectj / perf4j 依赖项并 linked 到本地 jars
- 如前所述,aop.xml 确实如更新中所述那样被拾取,没有错误或警告,只是确认编织方法
好的,我已经在 GitHub repo 中添加了一个完整的 Maven 示例,您可以直接克隆并使用它。
需要考虑的一些基本事项:
- 对于编译时编织 (CTW),您需要在编译和 运行 代码时在类路径上
aspectjrt.jar
。您还需要使用 AspectJ 编译器来构建项目,普通的 Java 编译器是不够的。
- 对于加载时编织 (LTW),您需要
aspectjweaver.jar
作为命令行上的 Java 代理,当 运行 运行代码时:-javaagent:/path/to/aspectjweaver.jar
。您还需要将它作为 VM 参数添加到 IDEA 中的 LTW 运行 配置中。
- 对于 LTW,您的资源文件夹中还需要
META-INF/aop.xml
。另请注意,为了包含子包,您应该使用 ..*
表示法,而不仅仅是 .*
,例如<include within="de.scrum_master..*"/>
.
您可以在我的项目的自述文件中找到更多信息。
P.S.: Perf4J 文档已过时且项目无人维护。因此,它仍然提到 AspectJ 1.6.x 作为必要的依赖项。我使用最新的 AspectJ 1.8.10 构建并 运行 一切,它 运行 很好,来自 Maven 和 IDEA。
我正在尝试在 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 配置正确,但它仅包含 headers 并且没有来自标记方法的统计信息。
我的主要问题是 AspectJ 配置应该放在 Intellij 中的什么位置,我已经将 aop.xml 包含在 src 文件夹中手动创建的 META-INF 文件夹下,但我不确定这一点完全被 AspectJ 检测到。
提前致谢
更新
自从我最初 post 以来,我在这方面取得了一些进展,具体介绍了两个变化: i) 包括 -javaagent:lib\aspectjweaver.jar ii) 将 aop.xml 移动到 META-INF 文件夹中。 现在正在选择 aop 配置,因为它记录了配置详细信息,并且还提到了正在分析的方法。 现在的问题是被分析的线程崩溃了,它没有记录任何异常,但通过调试,这个问题似乎与尝试实例化 org.aspectj.runtime.reflect.JoinPointImpl.[=12= 时 org.aspectj.runtime.reflect.Factory 中的 ClassNotFoundException 有关]
为了隔离问题,我删除了 aspectJ 的所有 maven 导入并使用了安装包提供的 jar,但问题仍然存在,而且应用程序在没有任何日志记录的情况下崩溃这一事实使问题跟踪变得更加困难。
更新
澄清一下:
- 阅读更多相关信息,包括回程中的手册后 link(感谢),我意识到我混淆了 load-time / compile-time 方法。从那时起,我尝试了指南中描述的两种方法,但结果与我之前更新中描述的相同。
- 如上所述,我确实使用 aspectj weaver 选项 (-javaagent) 启动应用程序
- 构建是通过 IDE 完成的,按照上面的说明,目前我已经从 Maven 中删除了 aspectj / perf4j 依赖项并 linked 到本地 jars
- 如前所述,aop.xml 确实如更新中所述那样被拾取,没有错误或警告,只是确认编织方法
好的,我已经在 GitHub repo 中添加了一个完整的 Maven 示例,您可以直接克隆并使用它。
需要考虑的一些基本事项:
- 对于编译时编织 (CTW),您需要在编译和 运行 代码时在类路径上
aspectjrt.jar
。您还需要使用 AspectJ 编译器来构建项目,普通的 Java 编译器是不够的。 - 对于加载时编织 (LTW),您需要
aspectjweaver.jar
作为命令行上的 Java 代理,当 运行 运行代码时:-javaagent:/path/to/aspectjweaver.jar
。您还需要将它作为 VM 参数添加到 IDEA 中的 LTW 运行 配置中。 - 对于 LTW,您的资源文件夹中还需要
META-INF/aop.xml
。另请注意,为了包含子包,您应该使用..*
表示法,而不仅仅是.*
,例如<include within="de.scrum_master..*"/>
.
您可以在我的项目的自述文件中找到更多信息。
P.S.: Perf4J 文档已过时且项目无人维护。因此,它仍然提到 AspectJ 1.6.x 作为必要的依赖项。我使用最新的 AspectJ 1.8.10 构建并 运行 一切,它 运行 很好,来自 Maven 和 IDEA。