Log4J bei mehreren Modulen

DaBe1812

Bekanntes Mitglied
Hi,
ich habe ein Problem in meinem Projekt beim Testen.
Ich verwende Log4j2 als Logger. Mein Projekt besteht aus vielen kleinen Modulen, von denen die meisten komplett selbstständig lauffähig sind. Packe ich jetzt in jedes meiner Module in den resources-Ordner eine log4j2.xml, dann loggt das Modul beim Testen sauber da hin, wo ich es gerne hätte.
Wenn ich jetzt aber ein Modul kompilieren, welches mehrere dieser Einzelmodule enthält, dann wird scheinbar irgendeine dieser log4j2.xml genommen und als DIE log4j2.xml verwendet.
D.h. das logging ist mehr oder minder zwar da, aber ich unterscheide z.B. für die Untermodule den Dateinamen in den geloggt werden soll und dann gibt es keine Aufspaltung und der Dateiname ist irgendeiner.
Beholfen habe ich mir jetzt damit, dass ich in keinem meiner Module eine log4j2.xml habe, sondern nur in dem "Hauptmodul" welches die anderen verwendet. Da habe ich dann mehrere File-Appender eingetragen und das System funktioniert. Aber beim testen der Einzelmodule bekomme ich jetzt kein Logging mehr und muss eigentlich alles, was ich schnell in der Konsole checken möchte mit System.out testen, was ich dann hinterher wieder entfernen muss, weil es eigentlich nicht schön ist.

Gibt es hier irgendeine Möglichkeit, dass das logging in beiden Fällen funktioniert? Am besten sogar mit einer log4j2-Konfiguration in jedem einzelnen Projekt, weil ich dann Konfigurationen viel einfache nachpflegen kann und muss nicht immer erst noch das Modul suchen in welchem die log4j2.xml liegt.
 

KonradN

Super-Moderator
Mitarbeiter
Was genau machst Du denn, um die Module zusammen zu führen. Das klingt für mich etwas danach, dass Du eine FAT Jar baust und dann gibt es halt mehrere log4j2.xml Dateien und "eine gewinnt".

In so einem Szenario gehe ich hin, uns sage, dass von den Abhängigkeiten eben die gemeinsame Datei nicht mitgenommen werden soll und damit habe ich dann im Hauptprojekt genau die Version, die ich brauche und in der ich dann ja genau weiss, was ich so alles brauche.

Oder Du hast alle möglichen jar Dateien und dann wird halt die log4j2.xml genommen, die zuerst im Classpath kommt?

Daher beschreib bitte etwas genauer dein Szenario.

Edit: Und natürlich kannst Du Dir auch https://logging.apache.org/log4j/2.x/manual/configuration.html anschauen. Da wird die Suchreihenfolge im Detail beschrieben sowie die Möglichkeiten, die Du hast (z.B. über die Property log4j2.configurationFile Property.
 

DaBe1812

Bekanntes Mitglied
Jupp, wir reden über eine FAT-Jar, d.h. alle Module sind gebuildet und werden dann im Über-Modul als Depenencies mit eingebunden. Theoretisch könnte man tatsächlich die log4j2.xml beim Builden weglassen, weil das Jar-File später auf jeden Fall nicht Standalone verwendet wird.
 

KonradN

Super-Moderator
Mitarbeiter
Dann ist es doch erst einmal einfach. Beim Bau der FAT Jar lässt Du die log4j2.xml weg.

Beim Shade Plugin gibst Du einfach einen Filter an. Bei jedem Filter kannst Du angeben:
  • artifact- das ist ein groupId:archetypeId wobei Du auch Wildcards verwenden kannst wie :
  • in excludes ein oder mehrere exclude - das wäre dann z.B. hier /log4j2.xml

Das ist eine durchaus übliche Vorgehensweise z.B. auch um Signaturen zu entfernen, die enthalten sein könnten.

Aber natürlich kannst Du auch generell die log4j2.xml aus den jar Dateien entfernen.
 

DaBe1812

Bekanntes Mitglied
Cool, bei Ant ging das ähnlich, aber da ich noch am Lernen bin mit Maven muss ich jetzt erstmal lesen, wie das mit dem Shade Plugin geht. Bzw. bin ich mir fast sicher, dass ich da auch ein Beispiel in deiner riesigen POM finden werde.
 

KonradN

Super-Moderator
Mitarbeiter
Nein, in den beiden GitHub Projekten wird das shade Plugin nicht genutzt. Aber ein Beispiel kann ich Dir aus einem meiner anderen Projekte geben:
XML:
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>${maven.shade.plugin}</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <shadedArtifactAttached>true</shadedArtifactAttached>
                    <shadedClassifierName>full</shadedClassifierName>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <manifestEntries>
                                <Main-Class>${main.class}</Main-Class>
                                <Build-Version>1.0</Build-Version>
                            </manifestEntries>
                        </transformer>
                    </transformers>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/MANIFEST.MF</exclude>
                                <exclude>**/module-info.class</exclude>
                                <exclude>META-INF/LICENSE.txt</exclude>
                                <exclude>META-INF/LICENSE.md</exclude>
                                <exclude>META-INF/LICENSE</exclude>
                                <exclude>META-INF/NOTICE.md</exclude>
                                <exclude>META-INF/NOTICE</exclude>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
            </plugin>


Bei der Konfiguration sind en paar Dinge, die ich kurz erläutern möchte:
XML:
                    <shadedArtifactAttached>true</shadedArtifactAttached>
                    <shadedClassifierName>full</shadedClassifierName>

Standard Verhalten ist, dass das original jar umbenannt wurde und das shade jar dann an die Stelle des originalen jar Files kommt. Das wird hier ausgeschaltet und das shade jar wird ein -full.jar am Ende bekommen.

ServiceTransformer sorgt dafür, dass die Services der Abhängigkeiten alle weiter funktionieren. Also z.B. wenn Du JDBC Treiber einbinden musst oder so.

XML:
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <manifestEntries>
                                <Main-Class>${main.class}</Main-Class>
                                <Build-Version>1.0</Build-Version>
                            </manifestEntries>
                        </transformer>

Ich schreibe das Manifest noch einmal selbst. Daher auch das ausfiltern der Manifest Dateien in den excludes.

Die Filter sind nicht zu übersehen - da nehme ich halt diverse Dinge raus:
  • allen Artefakte (:) - das betrifft auch das eigene Artefakt/Projekt
  • alle Manifests - daher schreibe ich ein eigenes.
  • module-info.class wird komplett entfernt. Das ** kommt, weil man das auch in Unterordnern kommen kann (für spezifische Java Versionen)
  • paar Lizenz und Notice Dateien - Wenn das shade Plugin meckert, dann fixe ich das in der Regel.
  • die letzten Drei Einträge kommen von signierten jar Dateien.


Das wäre dann das Beispiel mit kurzer Erklärug.
 

DaBe1812

Bekanntes Mitglied
Moin, jetzt hatte ich tatsächlich das erste Teilprojekt mit einem Fehler und habe mich gleich an den Einbau gemacht. Meine POM sieht jetzt so aus:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>simplechecktools</artifactId>
        <groupId>intern.pips</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>intern.pips.simplechecktools</groupId>
    <artifactId>Checker</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <main.class>intern.pips.simplecheck.checker.Checker</main.class>
        <main.module>AppModule</main.module>
        <link.name>${project.artifactId}</link.name>
        <launcher>${project.artifactId}</launcher>
        <appName>${project.artifactId}</appName>
        <jar.filename>${project.artifactId}</jar.filename>
    </properties>

    <dependencies>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>${main.class}</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <configuration>
                            <finalName>${jar.filename}</finalName>
                        </configuration>
                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- bind to the packaging phase -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>${maven.shade.plugin}</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <shadedArtifactAttached>true</shadedArtifactAttached>
                    <shadedClassifierName>full</shadedClassifierName>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>**/log4j2.xml</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
Ergebnis ist, dass ich jetzt eine "dependency-reduced-pom.xml" habe und im Target Folder ist die log4j2.xml trotzdem drin. Was habe ich jetzt falsch gemacht?
 

KonradN

Super-Moderator
Mitarbeiter
Ergebnis ist, dass ich jetzt eine "dependency-reduced-pom.xml"
Ja, denn das erstellte jar hat ja jetzt keine dependencies mehr. Wenn Du also diese jar Datei in einem anderen Projekt verwenden wolltest, dann würdest Du ja dieses veränderte pom haben wollen.

und im Target Folder ist die log4j2.xml trotzdem drin.
Da verstehe ich gerade nicht: Im target Folder ist die log4j2.xml? Oder meinst Du im -full.jar File?

Der Filter gibt ja an, was nicht in das full-jar File kommen sollen.
 

DaBe1812

Bekanntes Mitglied
Da verstehe ich gerade nicht: Im target Folder ist die log4j2.xml? Oder meinst Du im -full.jar File?
Alles klar, das war mein Denkfehler, ich hab in den TARGET-Folder im Projekt geschaut. In der -full.jar fehlt die log4j2.xml.
Ja, denn das erstellte jar hat ja jetzt keine dependencies mehr. Wenn Du also diese jar Datei in einem anderen Projekt verwenden wolltest, dann würdest Du ja dieses veränderte pom haben wollen.
Das verstehe ich nicht. Was bedeutet in dem Fall keine Dependencies? Weil alles, was dazu gehört schon im Jar-File drin ist?

Und dann noch die Frage, wenn ich mit das Maven Goual install ausführe, dann ist es ja in meinem lokalen Maven Repo, muss ich dann etwas bestimmtes in den POMs angeben, die die jar dann verwenden sollen, damit auch diese jar und nicht eine der beiden anderen gegriffen wird?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K log4j nach log4j2 überführen Java Basics - Anfänger-Themen 0
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
MiMa 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
U Funktionale Interfaces mit mehreren abstrakten Methoden? Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
Poppigescorn String mit mehreren Wörtern füllen? Java Basics - Anfänger-Themen 4
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
freudianslip if-Statement mit mehreren Zahlenwerten Java Basics - Anfänger-Themen 4
B Zeitgleiches Arbeiten am Code mit mehreren Personen? Java Basics - Anfänger-Themen 7
M Arrays mit mehreren Werten über JOptionPane initialisieren Java Basics - Anfänger-Themen 12
S Und-Abfrage mit mehreren Ungleich-Operatoren Java Basics - Anfänger-Themen 17
D Aufruf von mehreren Activities bringt die app zum Absturz Java Basics - Anfänger-Themen 5
G String mit mehreren Attributen aufteilen Java Basics - Anfänger-Themen 6
B Funktion mit mehreren Rückgabewerten aka Prozeduren? Java Basics - Anfänger-Themen 12
L Wie geht man bei mehreren Action Klassen vor? Java Basics - Anfänger-Themen 0
O compareTo nach mehreren Kriterien Java Basics - Anfänger-Themen 13
B Java Mail: suchen von mehreren Emailadressen Java Basics - Anfänger-Themen 5
R Antwort vom Server an mehreren Clients senden Java Basics - Anfänger-Themen 3
G Refactoring von mehreren identischen Klassen Java Basics - Anfänger-Themen 36
K Geburtsdaten von Mehreren Personen speichern und Alter ausgeben Java Basics - Anfänger-Themen 11
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
F Problem beim entfernen von mehreren Listenelementen auf einmal (Programmierung des Spiels Arschloch) Java Basics - Anfänger-Themen 1
S boolean Wert von mehreren int Möglichkeiten abfragen ? Java Basics - Anfänger-Themen 4
E if-Bedingung mit mehreren Möglichkeiten ? Java Basics - Anfänger-Themen 6
B MVC Struktur mit mehreren Szenen - wer schaut mal bitte drüber? Java Basics - Anfänger-Themen 2
A String mit mehreren Zeilen splitten Java Basics - Anfänger-Themen 4
U Schleife mit mehreren Bedingungen ? Java Basics - Anfänger-Themen 29
C OOP Von mehreren Klassen aus auf das selbe Objekt zugreifen Java Basics - Anfänger-Themen 8
M Erste Schritte Speichern von mehreren Daten Java Basics - Anfänger-Themen 3
B Variable in mehreren Klassen nutzen Java Basics - Anfänger-Themen 4
D Eine MySQL Verbindung in mehreren Klassen Java Basics - Anfänger-Themen 8
F Interface Nach mehreren Kriterien sortieren Java Basics - Anfänger-Themen 2
S OOP Variablen zwischen mehreren Klassen Java Basics - Anfänger-Themen 11
F Http Post von mehreren Daten Java Basics - Anfänger-Themen 5
Dechasa Interface JFrame mit mehreren Übereinander liegenden JPanel Java Basics - Anfänger-Themen 5
R Eine Datei mit mehreren Zeilen beschreiben Java Basics - Anfänger-Themen 5
S PHP Aufruf mit mehreren Variablen Java Basics - Anfänger-Themen 2
H Klassen Auf eine Hashtable aus mehreren Klassen zugreifen Java Basics - Anfänger-Themen 12
N Aufgabe: Pizza Konstruktor mit mehreren beliebigen Durchmesser/Preiskombinationen Java Basics - Anfänger-Themen 8
R Objekt erstellen - Attribute mit mehreren Werten Java Basics - Anfänger-Themen 1
F Selben Code in mehreren Projekten Java Basics - Anfänger-Themen 1
I Listen sortieren bei mehreren Listen zu einer Java Basics - Anfänger-Themen 2
M JUnit Testmethoden mit mehreren assert Methoden Java Basics - Anfänger-Themen 1
G Klassen Problem mit mehreren Klassen Java Basics - Anfänger-Themen 2
kaoZ Input/Output Android : Deserialisieren von mehreren Objekten in einer Datei Java Basics - Anfänger-Themen 0
J Menü mit mehreren Bildern Java Basics - Anfänger-Themen 5
kaoZ Input/Output Einlesen von mehreren Zeilen Java Basics - Anfänger-Themen 4
T Variablen Zufallsgenerator mit mehreren Variablen Java Basics - Anfänger-Themen 3
Devil0s Entwicklung mit mehreren Leuten Java Basics - Anfänger-Themen 7
3 JLabel - Text in mehreren Zeilen zentrieren Java Basics - Anfänger-Themen 5
R Compiler-Fehler Auf selben Array in mehreren "cases" vom "Switch" zugreifen Java Basics - Anfänger-Themen 11
K Vererbung Methoden in klassen auslagern und in mehreren Klassen verfügbar machen Java Basics - Anfänger-Themen 8
D Eine Variable in mehreren "switch" Java Basics - Anfänger-Themen 24
P Liste in einer Klasse füllen und mehreren anderen Klassen lesend verwenden Java Basics - Anfänger-Themen 5
propra Objekte in mehreren Listen Java Basics - Anfänger-Themen 6
T GUI Prog. mit mehreren Klassen Java Basics - Anfänger-Themen 4
K Erste Schritte Eingabetext besteht aus mehreren Zeilen? Java Basics - Anfänger-Themen 3
D javac zum Kompilieren von mehreren Dateien Java Basics - Anfänger-Themen 6
P Auslesen von mehreren XML Dateien - Fehler Java Basics - Anfänger-Themen 11

Ähnliche Java Themen


Oben