在intellij

时间:2017-04-12 19:02:55

标签: intellij-idea aspectj perf4j

我正在尝试在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中,我已经在src文件夹中手动创建的META-INF文件夹下包含了aop.xml但是我不确定它是否被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依赖项并链接到本地​​jar
  • 如上所述,aop.xml确实会在更新中提到,没有错误或警告,只需确认编织方法

1 个答案:

答案 0 :(得分:1)

好的,我已经为GitHub repo添加了一个完整的Maven示例,您只需克隆并使用它即可。

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

  • 对于编译时编织(CTW),在编译和运行代码时,在类路径上需要aspectjrt.jar。您还需要使用AspectJ编译器来构建项目,普通的Java编译器是不够的。
  • 对于加载时编织(LTW),在运行代码aspectjweaver.jar时,在命令行上需要-javaagent:/path/to/aspectjweaver.jar作为Java代理。您还需要将其作为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。