Spring Boot: LoggingApplicationListener beeinträchtigt die Protokollierung des Anwendungsservers

8

Spring Boot initialisiert automatisch das zugrunde liegende Logging-System mit LoggingApplicationListener . Das ist eine nette Sache, wenn die Anwendung, die ich entwickle, isoliert oder eigenständig läuft.

Ich entwickle jedoch eine Webanwendung, die in den WSO2 Application Server implementiert wird, der eine einheitliche Protokollierung (mit log4j) bietet, mit Funktionen wie der zentralen Protokollverwaltung (zur Laufzeit über Webinterface), Geschäftsberichten usw.

Wenn ich Spring Boot "wie es ist" benutze, protokolliert es alles vollständig selbstständig. Mein erster Versuch war, spring-boot-starter-logging zu entfernen und slf4j-api als provided manuell hinzuzufügen. Dies funktioniert bis zu einem gewissen Grad, da LoggingApplicationListener jetzt die Einstellungen des globalen Logmanagers überschreibt, der von WSO2 bereitgestellt wird (und bewirkt sogar, dass globale Appender geschlossen werden).

Die einzige "Lösung", die ich mir ausgedacht habe, ist, den Hörer durch Reflexion zu entfernen. Dann beginnt Spring Boot sich genau so zu verhalten, wie es sollte (Protokollierung über den globalen Logger und nicht überschreiben der vordefinierten Log-Level, Ausgabeformate, Appender, etc.)

Diese "Lösung" sieht so aus:

%Vor%

Gibt es eine bessere Lösung für mein Problem, die vielleicht weniger Hacky ist, die ich während meiner Recherche und Codeanalyse übersehen habe?

    
Andreas 13.04.2015, 16:07
quelle

2 Antworten

3

Danke für Sie, es ist sehr hilfreich. Ich hatte das gleiche Problem mit dem Websphere-Anwendungsserver: Nachdem der Spring-Boot-Kontext initialisiert wurde, hatte ich keine Protokolle mehr. Diese Lösung ist äquivalent, aber weniger schmutzig, indem die run-Methode von SpringBootServletInitializer überschrieben wird:

%Vor%     
Christophe Rodriguez 16.10.2015 13:17
quelle
1

Seit Spring Boot 1.4 kann die automatische Konfiguration des LoggingSystems deaktiviert werden.

Sehen Sie sich die Benutzerdefinierte Protokollkonfiguration Abschnitt der Spring-Dokumentation:

  

Sie können Spring Boot erzwingen, ein bestimmtes Protokollierungssystem zu verwenden, indem Sie die Systemeigenschaft org.springframework.boot.logging.LoggingSystem verwenden. Der Wert sollte der vollständig qualifizierte Klassenname einer LoggingSystem -Implementierung sein. Sie können die Protokollierungskonfiguration von Spring Boot auch vollständig deaktivieren, indem Sie den Wert none verwenden.

Setzen Sie für Tomcat beispielsweise die Umgebungsvariable JAVA_OPTS :

%Vor%     
tril 15.03.2018 13:13
quelle