2017-11-08 74 views
6

W moim projekcie używam Logback jako narzędzia do logowania. Mam następującą klasęSpring @ Prestroy: Brak logowania, ponieważ logback zatrzymuje się zbyt szybko

Teraz, ja wdrażam servlet. Gdy wystąpi wyjątek, funkcja Logback nie drukuje komunikatu i nie wyświetla śladu stosu. Wynika to z faktu, że Logback oczyszcza się przed wywołaniem destroy() przez Spring. Kiedy sprężenie serwlet, jest to pierwszy (i ostatni) wiersz dziennika:

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

I sprawdzeniu, że Logback zatrzymuje pierwszy dodając System.out.println("..."); w destroy().

Czy można to naprawić?

Moi zależności:

<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> 

Należy pamiętać, że spring-jcl służy do trasy commons-logging do slf4j (który skieruje do logback). Nie używam jcl-over-slf4j.

+0

Możliwy duplikat [sprężyny wyników @PreDestroy w zalogowaniu losowo nie zalogowaniu] (https://stackoverflow.com/questions/30426533/springs-predestroy-results-in-logging -randomly-not-logging) – niekname

+0

Myślę, że to naprawdę ten sam problem. Każdy pomysł jak wyłączyć automatyczne zamknięcie z Logback ("LogbackServletContextListener") i ręcznie zamknąć Logback tak późno, jak to możliwe? Jestem w środowisku Tomcat/Spring. –

+0

Również duplikat: https://stackoverflow.com/questions/17400136/how-to-log-within-shutdown-hooks-with-log4j2 Upewnij się, że czytasz odpowiedź użytkownika "DjDCH" – niekname

Odpowiedz

4

Jest documented way wyłączyć wyłączyć rejestrowanie w LogbackServletContextListener:

Możesz wyłączyć automatyczną instalację LogbackServletContextListener ustawiając nazwie logbackDisableServletContainerInitializer w pliku web.xml Twojego web-aplikacji . Oto odpowiedni fragment.

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

Zauważ, że zmienna logbackDisableServletContainerInitializer można również ustawić jako właściwości systemowe Java zmiennej środowiskowej OS. Najbardziej priorytetowe jest ustawienie lokalne, tzn. Najpierw aplikacja internetowa, druga właściwość systemu i środowisko systemu operacyjnego.

Mogę sobie wyobrazić, prawdopodobnie będziesz chciał napisać własny hak zamykania, czy jest to przypadek i zatrzymać LoggerContext

0

odebrać odpowiedź Dovmo użytkownika. Chodzi o zamówienie. Mam ten sam problem na Tomcat 8.5.x. Bacially, inicjator robi addListener, nie masz żadnej kontroli nad słuchaczem. Przy wyłączaniu Tomcat odwraca - iteruje tę listę, wybierając najpierw detektor Logback: Spring nie rejestruje niczego.

Niestandardowy detektor nie pomoże, ponieważ nie można go poprzedzić. Co działa na mnie na Tomcat jest:

<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>