【问题标题】:Enable perf4j profiled annotation in intellij在 intellij 中启用 perf4j 分析注释
【发布时间】:2017-04-12 19:02:54
【问题描述】:

我正在尝试在 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 有关。 reflect.JoinPointImpl.

为了隔离问题,我删除了 aspectJ 的所有 maven 导入,并使用了安装包提供的 jar,但问题仍然存在,而且应用程序在没有任何日志记录的情况下崩溃的事实使得问题跟踪更加困难。

更新

澄清一下:

  • 在阅读了有关此内容的更多信息后,包括返回链接中的手册(谢谢),我意识到我混淆了加载时间/编译时间方法。从那以后,我尝试了指南中描述的两种方法,但结果与我之前的更新中描述的结果相同。
  • 如上所述,我确实使用 aspectj weaver 选项 (-javaagent) 启动应用程序
  • 构建是通过 IDE 完成的,如上所述,目前我已经从 Maven 中删除了 aspectj / perf4j 依赖项并链接到本地​​ jars
  • 如前所述,aop.xml 确实如更新中所述被拾取,没有错误或警告,只是确认编织方法

【问题讨论】:

  • 感谢您的配置,但我缺少带注释的应用程序代码。我很了解 AspectJ,但不了解 Perf4J。从您的 aop.xml 我得出结论,您想使用加载时编织而不是编译时,对吗?那么您是否使用 AspectJ weaver 作为命令行上的 Java 代理正确启动了 JVM?以及如何构建您的应用程序?我希望有 Maven。这比纯粹的依赖于 IDE 的构建要好。请回答我所有的问题并使用示例代码编辑您自己的问题,然后我可以更好地帮助您。
  • 更新:我很好奇并创建了一个小的 Perf4J Maven 项目。它通过 AspectJ 编译器使用编译时编织而不是加载时编织。两种方式都在developer guide 中进行了描述(仅可通过 WayBack Machine 获得,因为 Codehaus 很久以前就关闭了),但需要手动设置,而不是使用 Maven。我更喜欢 Maven,因为它可以在任何 IDE 中运行,例如 Eclipse、IDEA,可能还有 Netbeans(从未尝试过)。它工作得很好,我看不出为什么 LTW 也不能工作。
  • 关于 LTW 的另一个问题:您是否在控制台上看到带有 &lt;weaver options="-verbose -showWeaveInfo"&gt; 的任何 AspectJ weaver 输出?有任何迹象表明文件正在被拾取吗?
  • 感谢您抽出宝贵时间。我已经更新了帖子,提供了更多信息和当前状态的更新。
  • 请回答我的问题。您的更新没有。

标签: intellij-idea aspectj perf4j


【解决方案1】:

好的,我已将一个完整的 Maven 示例添加到 GitHub repo,您可以直接克隆并使用它。

需要考虑的一些基本事项:

  • 对于编译时编织 (CTW),您需要在编译和运行代码时在类路径中添加 aspectjrt.jar。您还需要使用 AspectJ 编译器来构建项目,普通的 Java 编译器是不够的。
  • 对于加载时编织 (LTW),您需要在运行代码时在命令行上将 aspectjweaver.jar 作为 Java 代理:-javaagent:/path/to/aspectjweaver.jar。您还需要将其作为 VM 参数添加到 IDEA 中的 LTW 运行配置中。
  • 对于 LTW,您还需要资源文件夹中的 META-INF/aop.xml。另请注意,为了包含子包,您应该使用..* 表示法,而不仅仅是.*,例如&lt;include within="de.scrum_master..*"/&gt;

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

P.S.:Perf4J 文档已过时,项目未维护。因此,它仍然提到 AspectJ 1.6.x 作为必要的依赖项。我使用最新的 AspectJ 1.8.10 构建并运行了一切,它运行良好,来自 Maven 和 IDEA。

【讨论】:

  • 感谢您,这超出了我希望在这里找到的任何帮助。我克隆了您的存储库,对其进行了测试,然后将其调整到我的项目中,该项目现在可以使用本机 perf4j 注释 :-) 也很高兴看到尽管库很旧,但它仍然可以使用最新的 AspectJ 版本运行。
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2017-08-12
  • 1970-01-01
相关资源
最近更新 更多