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?
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%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 einerLoggingSystem
-Implementierung sein. Sie können die Protokollierungskonfiguration von Spring Boot auch vollständig deaktivieren, indem Sie den Wertnone
verwenden.
Setzen Sie für Tomcat beispielsweise die Umgebungsvariable JAVA_OPTS
:
Tags und Links java spring logging spring-boot wso2carbon