Intellij Idea 在intellij中启用perf4j分析注解

wfauudbj  于 2023-03-01  发布在  其他
关注(0)|答案(1)|浏览(228)

我试图在IntelliJ中启用perf4j注解,但是我很难正确地配置AspectJ,更具体地说,日志文件被正确地创建,但是缺少来自注解方法的任何数据。
以下是配置的相关摘录:

    • 回登录. 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)included-javaagent:lib\aspectjweaver. jar ii)已将aop.xml移至META-INF文件夹中。aop配置现在已被提取,因为它记录配置详细信息,并且还提到了正在分析的方法。现在的问题是正在分析的线程崩溃,它不记录任何异常,但通过调试,该问题似乎与尝试示例化org.aspectj.runtime.reflect.JoinPointImpl.org时org.aspectj.runtime.reflect.Factory中的ClassNotFoundException有关。
为了隔离这个问题,我删除了AspectJ的所有Maven导入,并使用了安装包提供的jar,但问题仍然存在,而且应用程序崩溃而没有任何日志记录的事实使问题跟踪变得更加困难。

    • 更新**

澄清:

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

m1m5dgzv1#

好了,我已经向GitHub repo添加了一个完整的Maven示例,您可以克隆它并进行操作。
需要考虑的一些基本事项:

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

您可以在我的项目的自述文件中找到更多信息。
P.S.:Perf4J文档已经过时了,项目也没有得到维护。因此,它仍然提到AspectJ 1.6.x是必要的依赖项。我用最新的AspectJ 1.8.10构建和运行了所有东西,它运行得很好,无论是Maven还是IDEA。

相关问题