Log4J (v2) nachträglich in allen Klassen hinzufügen

Marantis

Mitglied
Hallo zusammen,

wir haben folgende Aufgabenstellung: Log4J nachträglich in allen Java-Klassen hinzufügen

Einmalig zu erledigen, manuell bpsw. per Textersetzungen durch Eclipse oder Netbeans, allerdings in mehr als 1000 Klassen. Daher einzeln von Hand in allen Klassen zu aufwendig.

Wir sind dankbar für reale und aufgabenbezogene Tips und Hilfen



Letztendlich teilt sich das Problem in 3 bzw. 5 Bereiche auf: (in allen Klassen aka *.java Dateien)

1. "imports" hinzufügen

Log4J imports:
package my.example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;


2. den Logger innerhalb der Klasse als Konstante definieren

Log4J Konstante:
public final class MyClass {

    private static final Logger LOG = LogManager.getLogger(MyClass.class);


3. Die "catch" Anweisungen korrigieren

Log4J catch:
} catch (ExceptionA a) {
    LOG.error(a.getLocalizedMessage(), a);
} catch (ExceptionB b) {
    LOG.error(b.getLocalizedMessage(), b);
} catch (ExceptionC c) {
    LOG.error(c.getLocalizedMessage(), c);
}

Speziell zu beachten sind die 2 folgenden Punkte

A) Bei der Logger Konstante ist die korrekte Klasse (MyClass) zu definieren (klassen-abhängig)
B) Bei der catch Anweisung ist der korrekte Name der Variable (abc) zu übernehmen (variablen-abhängig)

Da bis dato überhaupt kein Logger eingesetzt wurde, können wir hier auch nicht einfach pauschal bestehende Text ersetzen. Der Logger muss somit komplett "neu" zu allen Klassen hinzugefügt werden.

Aufgaben bzw. Problematik:
  • Definition der korrekten RegEx Anweisungen, um diese in der IDE (Eclipse oder Netbeans) als Suchen/Ersetzen Pattern projektübergreifend verwenden zu können.
  • Problematik hier: Insbesonders die letzten beiden Punkte (A und B) lassen vermuten, dass das mit RegEx allein nicht zu lösen ist.



Wie würdet ihr das Problem lösen?

Vielen Dank für eure Hilfe.
 
Zuletzt bearbeitet:

Barista

Top Contributor
Beim catch hilft wahrscheinlich dateiübergreifendes Suchen und Ersetzen eines Editors.
Ich bin mir aber unsicher, ob das auch mehrzeilig und bei unterschieldichen Einrückungen klappt.

Ansonsten schreib Dir einfach ein Tool, in Java ist alles notwendige drin.
 

kneitzel

Top Contributor
Also eine Idee, die mir in den Sinn kommt: AOP (Aspect oriented programming). Dann könntest Du das, was Du da brauchst, evtl. schon komplett erledigen. (Das Hinzufügen macht ja erst einmal nichts. Alles was Du machen willst, ist ja ein Logging im catch so ich Dich richtig verstanden habe.

Das ginge also etwas in diese Richtung:

Dort wird aber nichts mit dem catch gemacht - wie das aussehen könnte, sieht man z.B. hier:

Also der Hintergrund ist, dass das, was Du da an Funktionalität beschrieben hast, erst einmal sehr gut durch ein Aspect abgebildet werden könnte. Und statt das an vielen Stellen immer wieder zu bauen (doppelter Code) ist hier die Idee halt, das an nur einer Stelle zu implementieren und dann zu "verknüpfen".


Wenn dann das Logging mehr benutzt werden soll (Macht ja Sinn, das dann generell zu verwenden), dann bekommen die Klassen alle nach und nach die entsprechenden Anpassungen. Diese kann man ggf. auch verkürzen z.B. mittels Lombok - dann hast Du erst einmal nur eine @Log4j2 Annotation auf der Klasse.
Aber diese Anpassungen kommen nicht als ein großer Block sondern werden nach und nach erfolgen - halt immer, wenn eine Klasse angepackt wird.

Wenn das so aber keine Alternative ist, dann müsste man sich zur Not etwas bauen. Das kann zur Not ein einfacher Text-Editor sein:
- Import am Anfang einfügen
- Alle class xyz .... { finden ... nach dem { kommt dann die Klassenvariable.
- alle catch (Exception xyz) { finden um da dann das LOG dazu zu schreiben.

So Ihr klare Coding Standards habt, sollte man da einiges automatisch abhandeln können.
 

Barista

Top Contributor
Import am Anfang einfügen
Eclipse hat eine Möglichkeit organize imports für ganze Dateibäume.

Deshalb würde ich das Einfügen des Import als nicht so wichtig ansehen.

Ausgenommen ist, dass man organize imports eventuell nicht bennutzen will, weil es gegen die Projektrichtlinien verstösst oder einem die Versions-Historie verschmutzt.

Wenn man eine Automatik nutzt, kann man eventuell auch die Klassen-Identifier vollqualifiziert in den Code Einfügen.
 

kneitzel

Top Contributor
Also scheint da Eclipse tatsächlich für mehrere Dateien sowas zu machen (so es eindeutig ist). Das ist interessant.

Bei Logger kann es da zu Problemen kommen, denn im Modul java.logging ist java.util.logging.Logger.
(Umkehrschluss: Ab Java 9 mit modul-info.java müsste es eindeutig sein, so java.logging nicht eingebunden wurde.)
 

mrBrown

Super-Moderator
Mitarbeiter
Dumme Frage am Rande, aber: ihr habt in 1000 Klassen einfach "leere" Catch-Blöcke, in denen jetzt überall stumpf geloggt werden soll?
 

Marantis

Mitglied
Es gibt keine dummen Fragen ^^

Die Antwort lautet (wir, sprich unser Kunde, der gerade seinen steinalten Code optimiert) hat zwar try..catch aber bisher ohne jegliches Logging.

Daher können wir auch nicht "bestehenden" Code (scheibchenweise) durch die notwendigen oben beschriebenen Code-Fragmente ersetzen.

Zusätzlich danke an die versch. Ideen und Tips:

Zu den einzelnen Antworten

dateiübergreifendes Suchen und Ersetzen eines Editors.

nein, das funktioniert leider nicht, da bspw. der Klassenname dadurch nicht kontextsensitiv ermittelt und hinzugefügt wird, bspw. in der Anweisung:

Name der Klasse:
private static final Logger LOG = LogManager.getLogger(==> MyClass <== .class);

Das gleiche Problem existiert in der Ermittlung und Übernahme der Variablennamen in den einzelnen Catch-Anweisungen.

organize imports für ganze Dateibäume

Das funktioniert allerings erst NACHDEM der Logger in den Klassen definiert wurde und diesen kann man eben nicht einfach pauschal in allen Klassen hinzufügen, da der Name der Klasse dynamisch ermittelt und eingetragen werden muss.

AOP (Aspect oriented programming)

Hatten wir auch schon im Blick. Nur ist die Einarbeitung und Verwendung für einen eigentlich ziemlich primitiven Einzelfall wie mit Kanonen auf Spatzen schießen.


Ansonsten schreib Dir einfach ein Tool, in Java ist alles notwendige drin.

Genau das machen wir gerade!

Es wäre aber schön gewesen, wenn wir uns das hätten sparen können oder zumindest erleichtern, denn Log4J ist jetzt nicht gerade eine unbekannte LIB und das generelle AUTOMATISIERTE Erweitern von Klassen, um zusätzliche Implementierungen (bspw. um einen Logger) ist jetzt eigentlich auch nicht gerade neu oder unüblich.

Wir hatten gehofft, uns mit ein paar Tips und Tricks, die Coding-Arbeit (zumindest in Teilen) sparen zu können.

Wenn wir fertig sind, werden wir den Code veröfffentlichen.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M log4j als separate Dateien in Schleife? Java Basics - Anfänger-Themen 6
L Erste Schritte Log4J Fragen Java Basics - Anfänger-Themen 5
B Log4J Pfad des Logfiles definieren Java Basics - Anfänger-Themen 6
Tom299 Log4j in jeder Klasse definieren? Java Basics - Anfänger-Themen 12
O Wie Log4J - Ausgaben/Events auffangen?! Java Basics - Anfänger-Themen 3
S log4j in externer Library Java Basics - Anfänger-Themen 4
M xml log4j überschreiben für/in Java Klassen Java Basics - Anfänger-Themen 4
N wie *.class-Dateien mit log4j loggen? Java Basics - Anfänger-Themen 9
F Log4j - log4j:WARN No appenders could be found for logger Java Basics - Anfänger-Themen 1
0 Log4J Probleme beim einlesen der Log datei Java Basics - Anfänger-Themen 2
0 Log4J Instanz erzeugen Java Basics - Anfänger-Themen 2
M Input/Output log4j mit properties datei Java Basics - Anfänger-Themen 6
T LOG4J Konfiguration Java Basics - Anfänger-Themen 5
W log4j "installieren" Java Basics - Anfänger-Themen 10
F ThreadId in Log4j Java Basics - Anfänger-Themen 4
M log4j Java Basics - Anfänger-Themen 11
H Log4J und Angabe eines Ordners Java Basics - Anfänger-Themen 5
A log4j - wie kann ich im Quellcode initialisieren statt in der properties-Datei? Java Basics - Anfänger-Themen 2
A log4j - Warum wird Methode getHeader 2x ausgeführt? Java Basics - Anfänger-Themen 2
S log4j pfad per umgebungsvariable setzen? Java Basics - Anfänger-Themen 2
G Probleme mit log4j Java Basics - Anfänger-Themen 2
M log4j design Java Basics - Anfänger-Themen 11
G log4j Java Basics - Anfänger-Themen 4
S LineNumberReader - bessere Lösung möglich? - Log4J Java Basics - Anfänger-Themen 9
G Kompletten Stacktrace mit Log4j ausgeben Java Basics - Anfänger-Themen 3
M logging mit log4j Java Basics - Anfänger-Themen 4
M log4j frage zu whitespaces Java Basics - Anfänger-Themen 2
G log4j Java Basics - Anfänger-Themen 3
H Log4J Pfad setzen Java Basics - Anfänger-Themen 2
M log4j Unterverzeichnis mit Datum , Timestamp in LogDateiname Java Basics - Anfänger-Themen 2
G Log4j? Java Basics - Anfänger-Themen 15
G Log4j notwendig oder nicht? Java Basics - Anfänger-Themen 16
J Log4j + Junit Java Basics - Anfänger-Themen 4
M log4j XML Konfigurationsdatei Java Basics - Anfänger-Themen 2
M "System.out" "System.err" bzw. log4j Java Basics - Anfänger-Themen 9
K log4j Java Basics - Anfänger-Themen 2
R log4j - Datum an Logdatei anhängen möglich? Java Basics - Anfänger-Themen 7
S log4j "Richtiges" Design Java Basics - Anfänger-Themen 4
B Log4J Anfänger sucht hilfe! Java Basics - Anfänger-Themen 4
N Log4J Problem Java Basics - Anfänger-Themen 4
C Nachträglich neue grafische Objekte hinzufügen Java Basics - Anfänger-Themen 7
P Wie Java-Plugin in Firefox (nachträglich) installieren? Java Basics - Anfänger-Themen 2
R Grafische Benutzeroberfläche GUI nachträglich einbauen Java Basics - Anfänger-Themen 3
M Objekt Name für MethodenAufruf nachträglich zuweisen? Java Basics - Anfänger-Themen 2
K Klassen Nachträglich ein Objekt einem anderen zuweisen, geht das? Java Basics - Anfänger-Themen 2
K Nachträglich auf Objekte zugreifen Java Basics - Anfänger-Themen 2
P Nachträglich Klasse zu Package hinzufügen Java Basics - Anfänger-Themen 16
I wie kann man die Console nachträglich öffnen? Java Basics - Anfänger-Themen 6
B JPanel nachträglich verändern Java Basics - Anfänger-Themen 20
T Nachträglich Erben Java Basics - Anfänger-Themen 7
G Dateiname nachträglich mit endung versehen Java Basics - Anfänger-Themen 5
G JLabel nachträglich verändern, bzw. ImageIcon ändern? Java Basics - Anfänger-Themen 3
F Properties nachträglich hinzufügen Java Basics - Anfänger-Themen 3
V public nachträglich in public static umwandeln /JFormDesigne Java Basics - Anfänger-Themen 5
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
L Classpath Jar exportieren mit allen Libaries Java Basics - Anfänger-Themen 1
C Array in allen Kombinationen ausfüllen Java Basics - Anfänger-Themen 17
L Vererbung auf Methode einer abgeleiteten Klassezu greifen, die nicht in allen abgeleiteten existiert Java Basics - Anfänger-Themen 3
B ArrayList.clear - Daten in allen Referenzen weg Java Basics - Anfänger-Themen 2
Y Schriftproblem in allen Java Anwendungen Java Basics - Anfänger-Themen 2
alderwaran überladene methoden mit allen möglichen typen aufrufen Java Basics - Anfänger-Themen 3
D GUI Checkboxen in allen Klassen abfragen? Java Basics - Anfänger-Themen 5
F 4 STrings in allen Kombinationen miteinander kombinieren Java Basics - Anfänger-Themen 2
A File mit allen Laufwerken? Java Basics - Anfänger-Themen 4
E Vector Fehler bei allen Methoden von Vector Java Basics - Anfänger-Themen 2
M Buttons auf allen Masken Java Basics - Anfänger-Themen 4
P Instanz mit allen Attributen ausgeben Java Basics - Anfänger-Themen 3
F Dialog mit allen verfügbaren Druckern Java Basics - Anfänger-Themen 2
T JTextArea mit allen Formatierungen in eine Datei schreiben Java Basics - Anfänger-Themen 15

Ähnliche Java Themen


Oben