Log4J Plugin für JConsole/VisualVM

vorhergehende Artikel in: Java Komponenten Git(lab|hub)
25.03.2018

Während meines Jahreswechselurlaubes versuche ich immer ein wenig Bildungsurlaub zwischenzuschieben. Dazu zählt der chaos communication congress ebenso wie manche Fingerübung. Aus einer dieser Fingerübung entstand ein kleines Projekt, das bis zu einem GitHub-Repository gewachsen ist...

Nachdem ich einen Log4J-Appender gebaut hatte, der die einzelnen Log-Messages in einer Swing-GUI anzeigen kann wollte ich diese Idee ein wenig ausbauen - zunächst schwebte mir eine Stand-Alone-JMX-Anwendung vor, die die Log-Events per JMX gemeldet bekommt und in der man dann eine GUI hat, mit der man Filter konfigurieren und einzelne Logger und Log-Level ein- und ausschalten kann.

Dafür wäre es allerdings nötig gewesen, dass ich eine JMX-Verbindung lokal zu einer laufenden Java-Anwendung aufbauen kann. Meine verzweifelte Suche nach Informationen, wie die Connect-URL in diesem Fall aussehen muss bescherte mir Einblicke in die internen Funktionen einer Oracle-VM: wer schon einmal die JConsole gestartet hat, hat wahrscheinlich gesehen, dass man sich damit zu jeder aktuell laufenden Java-Anwendung verbinden kann.

Das bedeutet nicht, dass die Anwendungen per default immer einen Port für das JMX-Protokoll öffnen. Vielmehr ist es so, dass jede VM eine Schnittstelle hat, über die man sie verwalten und steuern kann (die Attach-Schnittstelle). Verbindet sich die JConsole nun mit einer Anwendung, bringt sie eine Instrumentierung über diese Schnittstelle ein, die den VM-seitigen Port für das JMX-Protokoll darstellt. Erst danach wird die lokale Verbindung zu diesem Port aufgebaut.

Wollte man dies in eigenen Applikationen nachstellen, nüsste man Klassen aus proprietären Paketen nutzen und das Ganze wäre so komplex und fragil, dass es mit einem Bugfix-Release für die JRE wahrscheinlich schon wieder zunichte gemacht werden würde.

An dieser Stelle mit meinen Versuchen angekommen fluchte ich bereits wieder auf die JConsole denn meiner Meinung nach hat Sun/Oracle hier beim Verbindungsmanagement versagt. Ich erinnerte mich an VisualVM und machte damit weiter.

Einer der Appender hatte ja bereits die Möglichkeit geboten, Log4J Log-Events als JMX-Notifications zu versenden. Die JConsole bietet allerdings keinerlei Filtermöglichkeiten für JMX-Notifications ann - entweder man wird mit allen zugeschüttet oder man erhält gar keine. Meine Idee also: vielleicht kann die VisualVM besser mit JMX und speziell mit Notifications umgehen?

Ich wurde zunächst desillusioniert: In VisualVM existiert nichts zu JMX - keine Unterstützung für Notifications und nicht einmal für MBeans. Das konnte ich nicht glauben und suchte im Internet - siehe da: Die Unterstützung existiert - allerdings in Form eines Plugins, das man erst nachinstallieren muss.

Das tat ich und nun hatte ich exakt dieselbe Funktionalität, die in der JConsole zur Verfügung steht. Dass brachte mich aber auf eine Idee: wenn es eine Plugin-Architektur gibt, muss es doch eine API und Dokumentation dafür geben - damit wäre ich in der Lage, ein eigenes Plugin zu schreiben: Dann würde die Instrumentierung und der Aufbau der JMX-Kommunikation von VisualVM erledigt und ich könnte mich auf das Filtern,... der Notifications konzentrieren.

Die Dokumentation war schnell gefunden - als ich allerdings bereits zu Anfang las: Öffne Netbeans und lege ein neues Projekt vom Typ Netbeans-Modul an... Ich habe viele Jahre lang gern und mit Erfolg Netbeans als IDE benutzt. Aber immer wenn Vendor Lock-In auch nur entfernt erahnbar ist kriege ich Fieberbläschen!!

Das Projekt war damit schon fast gestorben, als ich aus den Augenwinkeln ein VisualVM-Plugin erspähte, das es gestattete JConsole-Plugins in VisualVM zu nutzen. Das sah ich mir näher an und siehe da: Nicht nur war die Schnittstelle wesentlich simpler als die für die direkte Integration in VisualVM, es gab auch Beispiele dafür und ich konnte damit Plugins schreiben, die in beiden Anwendungen nutzbar waren und war nicht auf eine bestimmte IDE festgelegt. Dazu kommt noch, dass es sehr einfach ist, neue Plugins als Maven-Projekte zu realisieren. Man kann eigene Projekte auf diversenBeispielen GitHub einsehbar.

Artikel, die hierher verlinken

Fork der Material Design Icons von Google

07.12.2019

Nun habe ich nach QBrowser und dem Log4J Plugin für JConsole/VisualVM mit I18NEditor bereits die dritte Java-Desktop-Anwendung veröffentlicht. Zur Zeit benutze ich dafür die Material Design Icons von Google, allerdings reichen mir die dort angegebenen für meine Zwecke nicht mehr aus.

Icons - woher nehmen? - III

06.05.2018

Es ist schon einige Zeit seit meinem letzten Artikel zu diesem Thema vergangen. Da ich in letzter Zeit das eine oder andere Projekt auf Github veröffentlicht habe, benötigte ich dafür Icons mit entsprechend passenden Lizenzen.

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Certstream, InfluxDB, Grafana und Netflix

    16.04.2019

    Nachdem ich vor kurzem über mein erstes Spielen mit dem certstream berichtete, habe ich weitere Experimente gemacht und die Daten zur besseren Auswertung in eine InfluxDB gepackt, um sie mit Grafana untersuchen zu können.

    Weiterlesen...

Neueste Artikel

  • Die sQLshell ist nun cloudnative!

    Die sQLshell hat eine weitere Integration erfahren - obwohl ich eigentlich selber nicht viel dazu tun musste: Es existiert ein Projekt/Produkt namens steampipe, dessen Slogan ist select * from cloud; - Im Prinzip eine Wrapperschicht um diverse (laut Eigenwerbung mehr als 140) (cloud) data sources.

    Weiterlesen...
  • LinkCollections 2024 III

    Nach der letzten losen Zusammenstellung (für mich) interessanter Links aus den Tiefen des Internet von 2024 folgt hier gleich die nächste:

    Weiterlesen...
  • Funktionen mit mehreren Rückgabewerten in Java

    Da ich seit nunmehr einem Jahr bei meinem neeun Arbeitgeber beschäftigt und damit seit ungefähr derselben Zeit für Geld mit Python arbeite, haben sich gewisse Antipathien gegenüber Python vertieft (ich kann mit typlosen Sprachen einfach nicht umgehen) - aber auch einige meiner Gründe, Python zu lieben sind ebenso stärker geworden. Einer davon ist der Fakt, dass eine Methode in Python mehr als einen Wert zurückgeben kann.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.