Ich versuche, Perf4j Annotationen in Intellij zu aktivieren, aber ich habe Schwierigkeiten, AspectJ korrekt zu konfigurieren. Genauer gesagt wird die Protokolldatei korrekt erstellt, enthält jedoch keine Daten aus der annotierten Methode. Aktiviere profilierte Annotation perfor4j in intellij
Dies sind die einschlägigen Auszüge aus Konfiguration:
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>
Schließlich wird die Die zugehörige Testmethode ist mit der @Profiled-Annotation markiert. Dies ist Teil des in der aop.xml definierten Pakets.
Diese Konfiguration führt in der Protokolldatei erzeugt wird (was darauf hindeutet, dass die logback.xml richtig konfiguriert ist, aber nur er enthält keine Kopf- und Statistiken aus der getaggt Methode.
Die Hauptfrage, ich habe, ist, wo die AspectJ Konfiguration innerhalb IntelliJ gehen sollte, ich habe die aop.xml unter einem manuell erstellten Ordnern META-INF im src Ordner enthält, aber ich bin nicht sicher, ob dies überhaupt von AspectJ erkannt wird.
Vielen Dank im Voraus
UPDATE
Ich habe einige Fortschritte in diesem Bereich seit meinem ersten Post gemacht, insbesondere die Einführung von zwei Änderungen: i) -javaagent enthalten: lib \ aspectjweaver.jar ii) bewegt, um die aop.xml in einen Ordner META-INF. Die AOP-Konfiguration wird jetzt aufgenommen, da sie die Konfigurationsdetails protokolliert und auch die zu profilierende Methode angibt. Das Problem ist jetzt, dass der Thread, der profiliert wird, abstürzt, es werden keine Ausnahmen protokolliert, aber via Debug scheint das Problem mit einer ClassNotFoundException in org.aspectj.runtime.reflect.Factory in Verbindung zu stehen, wenn versucht wird, org.aspectj.runtime zu instanziieren .reflect.JointPointImpl.
Um das Problem zu isolieren habe ich alle Maven-Importe von aspectJ entfernt und verwendet die Gläser von dem Installationspaket zur Verfügung gestellt, aber das Problem besteht weiterhin, auch die Tatsache, dass die Anwendung ohne Protokollierung abstürzt das Problem Tracking erschwert.
UPDATE
Zur Klarstellung:
- Nach mehr darüber zu lesen Handbuch in der Wayback Link inklusive (danke dafür) Ich wurde mir klar, Ladezeit wurde Vertauschen/Compiler- Ansatz. Seitdem habe ich beide Methoden wie in der Anleitung beschrieben, aber mit den gleichen Ergebnissen wie in meinem früheren Update beschrieben, ausprobiert.
- Gemäß oben, kann ich die Anwendung mit aspectj Weber Option starten (-javaagent)
- Der Build über IDE getan wird, als je zuvor im Moment habe ich die aspectj/perf4j Abhängigkeiten von Maven entfernt haben und den lokalen verknüpft Gläser
- Wie erwähnt der AOP.xml nicht abgeholt, wie in der Aktualisierung ohne Fehler oder Warnung, nur eine Bestätigung der gesponnenen Methode erwähnt
Danke für die Konfiguration, aber ich vermisse den annotierten Anwendungscode. Ich kenne AspectJ gut, aber nicht Perf4J. Aus Ihrer aop.xml schließe ich, dass Sie das Laden der Ladezeit statt der Kompilierzeit verwenden möchten, richtig? Dann startest du deine JVM korrekt mit dem AspectJ Weber als Java-Agent in der Kommandozeile? Und wie baut man seine Anwendung? Mit Maven hoffe ich. Das wäre besser als ein reiner IDE-abhängiger Build. Bitte beantworten Sie alle meine Fragen und bearbeiten Sie Ihre eigene Frage mit Beispielcode, dann kann ich Ihnen besser helfen. – kriegaex
Update: Ich war neugierig und habe ein kleines Perf4J Maven-Projekt erstellt. Es verwendet kompiliertes Weben via AspectJ-Compiler anstelle von Ladezeitweben. Beide Wege sind im [Entwicklerleitfaden] (https://web.archive.org/web/20150507044849/http://perf4j.codehaus.org/devguide.html) beschrieben (nur über WayBack Machine verfügbar, da Codehaus geschlossen wurde vor langer Zeit), aber mit manueller Einrichtung, nicht mit Maven. Ich bevorzuge Maven, weil es in jeder IDE funktioniert, wie Eclipse, IDEA, wahrscheinlich auch Netbeans (nie probiert). Es funktioniert gut und ich sehe keinen Grund, warum LTW nicht auch funktionieren würde. – kriegaex
Noch eine Frage zu LTW: Siehst du irgendeine AspectJ-Weaver-Ausgabe auf der Konsole mit ''? Jedes Zeichen, dass die Datei überhaupt abgeholt wird? –
kriegaex