我正在尝试在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,但问题仍然存在,而且应用程序崩溃而没有任何日志记录这一事实使得问题跟踪更加困难。
更新
澄清:
答案 0 :(得分:1)
好的,我已经为GitHub repo添加了一个完整的Maven示例,您只需克隆并使用它即可。
需要考虑的一些基本事项:
aspectjrt.jar
。您还需要使用AspectJ编译器来构建项目,普通的Java编译器是不够的。aspectjweaver.jar
时,在命令行上需要-javaagent:/path/to/aspectjweaver.jar
作为Java代理。您还需要将其作为VM参数添加到IDEA中的LTW运行配置中。META-INF/aop.xml
。另请注意,为了包含子包,您应使用..*
表示法,而不仅仅是.*
,例如<include within="de.scrum_master..*"/>
。您可以在我的项目的自述文件中找到更多信息。
P.S。:Perf4J文档已过时,项目未维护。因此,它仍然提到AspectJ 1.6.x是必要的依赖项。我使用最新的AspectJ 1.8.10构建并运行了所有内容,它运行得很好,无论是来自Maven还是IDEA。