2017-08-31 2 views
0

Mein gesamtes System wird von slf4j mit log4j Implementierung protokolliert.
Ich hatte ein Problem, wenn ein neues Modul eine logback-classic Dependance für die Protokollierung verwendet, die nicht von pom.xml Datei ausgeschlossen werden kann, da es es bricht.Logback zu log4j Brücke

Zuerst habe ich versucht, auf dieser dritten Seite nach Lösungen zu suchen, konnte aber keine Lösungen finden, also dachte ich, dass eine Brücke zwischen ihnen etwas sein könnte, das es löst.

Was ich vor allem für die Suche ist meine Protokolle zwischen der deafult Konsole Protokollierung der Abhängigkeit zu meinen eigenen log4j.xml Loggern zu spalten und Appen so kann ich die separetly verwenden ..

Gibt es eine Brücke, so kann ich beide verwenden logback-classic und log4j unter slf4j mit Beispiel?

Danke!

Antwort

0

Sie sagte:

ich ein Problem hatte, wenn ein neues Modul ein logback-classic depdency für die Protokollierung verwendet, die aus pom.xml Datei kann nicht ausgeschlossen werden, da sie es bricht.

Ist das eine Annahme oder hast du es versucht? Wenn Sie es auch versucht haben, haben Sie auch die Logback-Core-Abhängigkeit entfernt? Die einzige Möglichkeit, diese Abhängigkeiten zu entfernen, würde das Modul beschädigen, wenn das Modul von der Protokollimplementierung abhängig ist, da das Logback die slf4j-API nativ implementiert. Wenn das Modul von der Implementierung und nicht von der API/Schnittstelle abhängt, kann ich nichts tun, ohne entweder die Abhängigkeiten zu entfernen (den Modulquellcode zu ändern) oder einige stubbed Versionen der Implementierungsklassen zu schreiben, von denen das Modul abhängt .

Wenn ich Code schreiben, der das Muster in den logback manual folgt Ich bin in der Lage, die Umsetzung von logback zu tauschen, so lange ohne Probleme log4j2 wie ich Abhängigkeiten von den Klassen logback Implementierung nicht vorstellen. Hier

ist das Beispiel, das ich schrieb:

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class Main { 

    private Logger log = LoggerFactory.getLogger(Main.class); 

    public static void main(String[] args) { 

     Main main = new Main(); 
     main.main(); 
    } 

    public void main(){ 
     log.trace("trace msg"); 
     log.debug("debug msg"); 
     log.info("info msg"); 
     log.warn("warn msg"); 
     log.error("Error msg"); 

     log.info(log.getClass().getName()); 
    } 
} 

Hier sind die Abhängigkeiten in der pom:

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.22</version> 
    </dependency> 

    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-core</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.2.3</version> 
    </dependency> 

Hier ist der Ausgang:

00:48:26.378 [main] DEBUG blah.Main - debug msg 
00:48:26.380 [main] INFO blah.Main - info msg 
00:48:26.380 [main] WARN blah.Main - warn msg 
00:48:26.380 [main] ERROR blah.Main - Error msg 
00:48:26.380 [main] INFO blah.Main - ch.qos.logback.classic.Logger 

Jetzt habe ich die pom ändern Ersetzen der Logback-Gläser durch log4j2:

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.22</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-slf4j-impl</artifactId> 
     <version>2.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.7</version> 
    </dependency> 

Hier ist die Ausgabe nach dieser Änderung:

2017-09-03 00:52:21,630 INFO b.Main [main] info msg 
2017-09-03 00:52:21,631 WARN b.Main [main] warn msg 
2017-09-03 00:52:21,631 ERROR b.Main [main] Error msg 
2017-09-03 00:52:21,632 INFO b.Main [main] org.apache.logging.slf4j.Log4jLogger 

So auf dieser Basis Ich denke, Sie sollten, wenn es den „richtigen Weg“ umgesetzt werden, in der Lage, die logback Gläser mit log4j2 und es zu tauschen sollte "einfach funktionieren".

Sie haben auch gesagt:

Was ich vor allem für die Suche ist meine Protokolle zwischen der deafult Konsole Protokollierung der Abhängigkeit zu meiner eigenen log4j zu spalten.xml-Logger und Appen so kann ich die separetly ..

Jetzt ist es ganz klar zu mir, was Sie fragen, aber ich glaube, Sie Log-Meldungen aus dem Modul gehen auf die Konsole sowie alle Protokolle Sie haben wollten Verwenden Sie mit Ihrer Log4j2-Konfiguration. Wenn dies der Fall ist, ändern Sie einfach Ihre log4j2-Konfiguration - fügen Sie einen Logger mit dem entsprechenden Namen hinzu und weisen Sie die entsprechenden Appender zu. Wenn die Klassen Ihres Moduls beispielsweise com.my.package.Class1, com.my.package.Class2, com.my.package.Class3 usw. sind, könnten Sie einen Logger für com.my.package erstellen und ihm einen Konsolenappender geben zusammen mit den entsprechenden Dateianhängern.

Hoffe, das hilft!