我试图在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文件夹中手动创建的main文件夹下包含了aop.xml,但我不确定AspectJ是否检测到了这一点。
提前感谢
更新
自从我的第一篇文章发表以来,我已经在这方面取得了一些进展,特别是介绍了两个更改: i)包含-javaagent:lib\aspectjweaver.jar ii)将aop.xml移动到META文件夹中。在记录配置细节时,aop配置现在正在被捕获,它还提到了要分析的方法。现在的问题是,所分析的线程崩溃了,它不会记录任何异常,但是通过调试,在尝试实例化ClassNotFoundException时,问题似乎与org.aspectj.runtime.reflect.Factory中的org.aspectj.runtime.reflect.JoinPointImpl有关。
为了隔离这个问题,我删除了aspectJ的所有maven导入,并使用了安装包提供的jars,但问题仍然存在,而且应用程序在没有任何日志记录的情况下崩溃,使得问题跟踪更加困难。
更新
澄清:
发布于 2017-04-14 10:00:58
好的,我向GitHub回购添加了一个完整的Maven示例,您只需克隆和播放即可。
一些需要考虑的基本问题:
aspectjrt.jar。您还需要使用AspectJ编译器来构建项目,一个普通的Java编译器是不够的。aspectjweaver.jar ( -javaagent:/path/to/aspectjweaver.jar )时,需要将-javaagent:/path/to/aspectjweaver.jar作为命令行上的Java代理。您还需要将它作为VM参数添加到IDEA中的LTW运行配置中。META-INF/aop.xml。还请注意,为了包含子包,您应该使用..*表示法,而不仅仅是.*,例如<include within="de.scrum_master..*"/>。您可以在我的项目的read-me文件中找到更多信息。
P.S.:Perf4J文档已经过时,项目没有维护。因此,它仍然将AspectJ 1.6.x作为必要的依赖项。我用最新的AspectJ 1.8.10构建并运行了所有东西,它运行得很好,无论是Maven还是IDEA。
https://stackoverflow.com/questions/43377648
复制相似问题