Log4J Plugin für JConsole/VisualVM

vorhergehende Artikel in: Java Komponenten OpenSource
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 veröffentlicht habe, benötigte ich dafür Icons mit entsprechend passenden Lizenzen.

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


Vor 5 Jahren hier im Blog

  • Multi-User-WebDAV, Docker, GitHub

    17.11.2019

    Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...

    Weiterlesen...

Neueste Artikel

  • Migration der Webseite und aller OpenSource Projekte

    In eigener Sache...

    Weiterlesen...
  • AutoHideToolbar für Java Swing

    Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.

    Weiterlesen...
  • Integration von EBMap4D in die sQLshell

    Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.

    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, muss 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 Codeberg-Repositories findet man hier.