Neulich ... Ich bin auf ein Ereignis gestoßen, bei dem das Protokoll nicht ausgegeben wurde, als die Webanwendung gestoppt wurde: cry: Ich werde die Ursache und Lösung aufschreiben.
Die Komponenten (grobe Komponenten) der Anwendung, in der dieses Ereignis aufgetreten ist, sind wie folgt.
Die Ursache war, dass "der Prozess zum Stoppen der Protokollausgabefunktion von Logback" zuerst in dem Prozess (Verwerfungsprozess) aufgerufen wurde, der ausgeführt wurde, als die Webanwendung gestoppt wurde.
Grob gesagt wurde der Prozess im folgenden Ablauf ausgeführt.
Logback (logback-classic) enthält eine Klasse namens "LogbackServletContainerInitializer". Bei der Bereitstellung auf einem Anwendungsserver, der Servlet 3.0 oder höher unterstützt, wird die Klasse "LogbackServletContextListener" automatisch im Servlet-Container registriert. Ich tat. In diesem Fall wurde "Prozess zum Stoppen der Protokollausgabefunktion von Logback" in der "contextDestroyed" -Methode von "LogbackServletContextListener" implementiert.
In diesem Fall ...
Mit einem solchen Gefühl scheint es, dass "der Prozess des Stoppens der Protokollausgabefunktion von Logback" ganz am Ende ausgeführt werden sollte.
So ändern Sie die Verarbeitungsreihenfolge ... Deaktivieren Sie zunächst die automatische Registrierungsfunktion von "LogbackServletContextListener". Es gibt verschiedene Möglichkeiten, es zu deaktivieren. In diesem Eintrag wird jedoch gezeigt, wie Sie es mithilfe der Parameter des Servlet-Containers deaktivieren können.
web.xml
<context-param>
<param-name>logbackDisableServletContainerInitializer</param-name>
<param-value>true</param-value>
</context-param>
NOTE:
Sie kann auch mithilfe von Systemeigenschaften oder Umgebungsvariablen deaktiviert werden.
- http://logback.qos.ch/manual/configuration.html#webShutdownHook
Definieren Sie nach dem Deaktivieren der automatischen Registrierung die Klasse "LogbackServletContextListener" vor der Listener-Klasse ("ContextLoaderListener"), um den Spring-Anwendungskontext zu initialisieren / zu zerstören.
<listener>
<listener-class>ch.qos.logback.classic.servlet.LogbackServletContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Auf diese Weise wird (vorerst ... in Tomcat) nach Durchführung des "Spring Application Context Destruction Process" der "Logback Log Output Function Stop Process" ausgeführt.
Recommended Posts