0

我正在尝试在 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 确实如更新中所述被拾取,没有错误或警告,只是确认编织方法
4

1 回答 1

1

好的,我已经在GitHub 存储库中添加了一个完整的 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..*"/>

您可以在我的项目的自述文件中找到更多信息。

PS:Perf4J 文档已过时,项目未维护。因此,它仍然提到 AspectJ 1.6.x 作为必要的依赖项。我用最新的 AspectJ 1.8.10 构建并运行了所有东西,它运行得很好,来自 Maven 和 IDEA。

于 2017-04-14T10:00:58.343 回答