2017-11-08 1 views
6

In meinem Projekt verwende ich Logback als Protokollierungsfunktion. Ich habe folgende KlasseSpring @ PreDestroy: Keine Protokollierung, da Protokollierung zu früh beendet wird

@Component 
class Test { 
    @PreDestroy 
    public void destroy() { 
     try { 
      ... 
     } catch (Exception e) { 
      LoggerFactory.getLogger(getClass()).error(e.getLocalizedMessage(), e); 
     } 
    } 
} 

Nun dekomprimiere ich das Servlet. Wenn eine Ausnahme auftritt, druckt Logback die Nachricht und die Stapelüberwachung nicht. Dies liegt daran, dass Logback aufgeräumt wird, bevor die von Spring aufgerufen wird. Wenn das Servlet undeploying, ist dies die erste (und letzte) Linie Protokoll:

15:46:19,084 |-INFO in [email protected]7fe56 - About to stop ch.qos.logback.classic.LoggerContext [default] 

ich festgestellt, dass Logback stoppt zunächst durch ein System.out.println("..."); im destroy() hinzufügen.

Gibt es eine Möglichkeit, das zu beheben?

Meine Abhängigkeiten: (welche routet zu logback)

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-framework-bom</artifactId> 
      <version>5.0.1.RELEASE</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
     <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>99-empty</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

<dependencies> 
    <dependency> 
     <groupId>commons-logging</groupId> 
     <artifactId>commons-logging</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.25</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> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-access</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jcl</artifactId> 
    </dependency> 
</dependencies> 

Bitte beachten Sie, dass spring-jcl auf Route commons-logging-slf4j verwendet. Ich verwende nicht jcl-over-slf4j.

+0

Mögliche Duplikat [Spring @PreDestroy Ergebnisse der Anmeldung Anmeldung nicht zufällig] (https://stackoverflow.com/questions/30426533/springs-predestroy-results-in-logging -randomly-not-logging) – niekname

+0

Ich denke, es ist in der Tat das gleiche Problem. Haben Sie eine Idee, wie Sie das automatische Herunterfahren von Logback (LogbackServletContextListener) deaktivieren und Logback so spät wie möglich manuell beenden? Ich bin in einer Tomcat/Spring-Umgebung. –

+0

Auch duplizieren von: https://stackoverflow.com/questions/17400136/how-to-log-within-shutdown-hooks-with-log4j2 Stellen Sie sicher, dass Sie die Antwort des Benutzers 'DjDCH' lesen – niekname

Antwort

4

Es gibt eine documented way deaktivieren Sie die Registrierung des LogbackServletContextListener zu deaktivieren:

Sie können deaktivieren Sie die automatische Installation von LogbackServletContextListener durch eine benannte logbackDisableServletContainerInitializer in Ihrem Web-Anwendung web.xml Datei Einstellung . Hier ist das relevante Snippet.

<web-app> 
    <context-param> 
     <param-name>logbackDisableServletContainerInitializer</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    .... 
</web-app> 

Beachten Sie, dass logbackDisableServletContainerInitializer Variable kann auch als Java-Systemeigenschaft ein OS-Umgebungsvariable gesetzt werden. Die am meisten lokale Einstellung hat Priorität, d. H. Web-App zuerst, System-Eigenschaft zweite und OS-Umgebung zuletzt.

Ich könnte mir vorstellen, Sie wahrscheinlich Ihre eigenen Shutdown-Hook wollen werde schreiben, wenn dies der Fall ist und stoppen die LoggerContext

0

Um Dovmo Antwort abholen. Es geht nur darum zu bestellen. Ich habe das gleiche Problem auf Tomcat 8.5.x. Der Initialisierer macht einen addListener, Sie haben keine Kontrolle über den Listener. Beim Herunterfahren wiederholt Tomcat diese Liste und wählt zuerst den Logback-Listener: Spring protokolliert nichts.

Ein benutzerdefinierter Listener hilft nicht, weil Sie ihn nicht vorgeben können. Was für mich auf Tomcat funktioniert, ist:

<listener> 
    <listener-class>ch.qos.logback.classic.servlet.LogbackServletContextListener</listener-class> 
</listener> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<context-param> 
    <param-name>logbackDisableServletContainerInitializer</param-name> 
    <param-value>true</param-value> 
</context-param> 
Verwandte Themen