2017-04-12 2 views
0

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
+0

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

+0

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

+0

Noch eine Frage zu LTW: Siehst du irgendeine AspectJ-Weaver-Ausgabe auf der Konsole mit ''? Jedes Zeichen, dass die Datei überhaupt abgeholt wird? – kriegaex

Antwort

1

Okay, ich habe ein volles Maven Beispiel zu einem GitHub repo hinzugefügt, die kann man einfach klonen und spielen, um mit.

Einige grundlegende Dinge zu beachten:

  • Zur Kompilierung-Weberei (CTW) Sie aspectjrt.jar auf dem Classpath müssen beim Kompilieren und Ausführen des Codes. Sie müssen auch den AspectJ-Compiler verwenden, um das Projekt zu erstellen, ein normaler Java-Compiler ist nicht genug.
  • Für das Load-Time Weaving (LTW) benötigen Sie aspectjweaver.jar als Java-Agent in der Befehlszeile, wenn Sie den Code ausführen: -javaagent:/path/to/aspectjweaver.jar. Sie müssen es außerdem als VM-Argument zu Ihrer LTW-Laufkonfiguration in IDEA hinzufügen.
  • Für LTW benötigen Sie auch META-INF/aop.xml in Ihrem Ressourcenordner. Bitte beachten Sie auch, dass Sie die Unterklasse ..* nicht nur .*, z. <include within="de.scrum_master..*"/>.

Weitere Informationen finden Sie in der Read-Me-Datei meines Projekts.

S.S .: Die Perf4J-Dokumentation ist veraltet und das Projekt nicht gepflegt. Daher erwähnt es immer noch AspectJ 1.6.x als notwendige Abhängigkeiten. Ich habe alles mit dem neuesten AspectJ 1.8.10 gebaut und ausgeführt und es läuft gut, sowohl von Maven als auch von IDEA.

+0

Danke dafür, es ist weit mehr als jede Hilfe, die ich hoffte, hier zu finden. Ich habe Ihr Repo geklont, getestet und dann an mein Projekt angepasst, das nun mit nativen Perf4j-Annotationen funktioniert :-) Es ist auch toll zu sehen, dass trotz der alten Bibliothek immer noch die neueste AspectJ-Version läuft. – Adunato

Verwandte Themen