2017-04-12 69 views
0

我试图在intellij中启用perf4j注释,但我正在努力正确配置AspectJ。更具体地说,日志文件是正确创建的,但缺少来自注释方法的任何数据。在intellij中启用perf4j配置文件注释

这些配置的相关摘要:

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的所有检测。提前

感谢

UPDATE

我已经在这个一些进展,因为我的初始后,具体地引入两个更改: ⅰ)包括-javaagent:LIB \ aspectjweaver.jar ⅱ)移动的aop.xml中成META-INF文件夹。 aop配置现在正在被选中,因为它记录了配置细节,并且还提到了正在分析的方法。 现在的问题是,正在分析的线程崩溃,它不记录任何异常,但通过调试这个问题似乎与org.aspectj.runtime.reflect.Factory中的ClassNotFoundException有关,当试图实例化org.aspectj.runtime .reflect.JoinPointImpl。

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

UPDATE

澄清:

  • 阅读更多关于这包括在自由之路链路的手册(对于感谢)后,我发现我被加载时混合向上/编译时做法。从那以后,我尝试了这两种方法,如指南中所述,但具有与之前更新中所述相同的结果。
  • 按照上面,我开始
  • 构建是通过IDE完成后,按照上面的那一刻我已删除从Maven的AspectJ的/的Perf4依赖关系,并与当地AspectJ织入选项(-javaagent)的应用罐子
  • 如上所述aop。作为更新没有错误或警告,该编织的方法
+0

感谢您的配置,但我缺少注释的应用程序代码。我很了解AspectJ,但不是Perf4J。从你的aop.xml中我得出结论,你想使用加载时编织而不是编译时,对吗?那么你是否在命令行中使用AspectJ weaver作为Java代理正确启动JVM?你如何构建你的应用程序?有了Maven,我希望。这比纯粹依赖IDE的版本更好。请回答我的所有问题,并使用示例代码编辑您自己的问题,然后我可以更好地帮助您。 – kriegaex

+0

更新:我很好奇,并创建了一个小的Perf4J Maven项目。它通过AspectJ编译器使用编译时编织,而不是加载时编织。这两种方法都在[开发人员指南](https://web.archive.org/web/20150507044849/http://perf4j.codehaus.org/devguide.html)中描述(仅通过WayBack Machine可用,因为Codehaus已关闭很久以前),但手动安装,而不是Maven。我更喜欢Maven,因为它适用于任何IDE,比如Eclipse,IDEA,也可能是Netbeans(从未尝试过)。它很好地工作,我没有看到为什么LTW不会工作的原因。 – kriegaex

+0

有关LTW的另一个问题:您是否在控制台上看到任何带有“的AspectJ Weaver输出?任何符号文件正在被拿起? – kriegaex

回答

1

好了的只是确认提到XML不能得到回升,我加入了一个完整的Maven的例子为GitHub repo,你可以只克隆和玩。

一些基本的东西要考虑:

  • 对于编译时织(CTW)在编译和运行代码时需要aspectjrt.jar在classpath。您还需要使用AspectJ编译器来构建项目,但普通的Java编译器是不够的。
  • 对于加载时织入(LTW),在运行代码时需要使用aspectjweaver.jar作为Java代理程序:-javaagent:/path/to/aspectjweaver.jar。您还需要将其作为VM参数添加到IDEA中的LTW运行配置中。
  • 对于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。

+0

感谢您的支持,这超出了我希望在这里找到的任何帮助。我克隆了你的repo,测试了它,然后将它改编为我的项目,该项目现在可以与本机perf4j注释一起工作:-)尽管库很旧,它仍然运行最新的AspectJ版本。 – Adunato

相关问题