2010-09-09 20 views
13

Przeprowadzamy migrację do logback z log4j dla kilku aplikacji internetowych. W zamknięciu naszej aplikacji możemy obecnie nazywamy:Czy muszę opróżniać zdarzenia podczas zamykania przy użyciu funkcji logback?

org.apache.log4j.LogManager.shutdown(); 

który ma opróżnić cały rejestrowanie transmisji asynchronicznej i zamknięcie wszystkich zasobów zewnętrznych (pliki, gniazda).

Czy jest coś podobnego w logbackach, czy w przypadku wyłączenia jest ono automatycznie spłukiwane?

Mike

+0

Ciekawe pytanie - że nigdy nie myślałem o tym. Ponieważ musisz jawnie skonfigurować log4j do wyjścia bufora, założyłbym, że zamknięcie może być konieczne tylko w tym przypadku. Domyślam się jednak, że bufor slf4j domyślnie. –

+2

logback opróżnia się po każdym logowaniu, więc nie ma potrzeby jawnego wywoływania stop(), chyba że robisz coś fajnego. –

+2

@DavidRoussel To stwierdzenie skłoniło mnie do sprawdzenia [Logback Appenders] (http://logback.qos.ch/manual/appenders.html). Rzeczywiście: _By domyślnie każde zdarzenie dziennika jest natychmiast przepłukiwane do podstawowego strumienia wyjściowego. To domyślne podejście jest bezpieczniejsze w tym sensie, że rejestrowanie zdarzeń nie zostanie utracone w przypadku, gdy aplikacja zostanie zamknięta bez odpowiedniego zamknięcia aplikacji. Jednak w przypadku znacznie zwiększonej przepustowości rejestrowania możesz ustawić właściwość directFlush w podstawowym Encoderze na wartość false. Enkodery, aw szczególności LayoutWrappingEncoder, opisane są w osobnym rozdziale._ –

Odpowiedz

0

nie jestem świadomy ogólnego wyłączenia menedżera jak log4j tych, ale ja zamknąć wszystkie moje indywidualne rejestratory kontekstowych, gdy ich kontekst jest niszczony przy użyciu ServletContextListener tak:

ContextSelector selector = StaticLoggerBinder.getSingleton().getContextSelector(); 
LoggerContext context = selector.detachLoggerContext(contextName); 
if (context != null) { 
    Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME); 
    context.reset(); 
} else { 
    System.err.printf("No context named %s was found", contextName); 
} 

Również LoggerContext Funkcja .stop() jest niedostępna i wykonuje niektóre z tych samych funkcji wewnętrznie, ale ja jej nie używam, więc nie mogę komentować, czy jej działanie jest lepsze niż resetowanie czy nie.

7

Oto proste podejście:

import org.slf4j.ILoggerFactory; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import ch.qos.logback.classic.LoggerContext; 

... 

ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory(); 
// Check for logback implementation of slf4j 
if (loggerFactory instanceof LoggerContext) { 
    LoggerContext context = (LoggerContext) loggerFactory; 
    context.stop(); 
} 
7

Wydaje się, że po prostu dodając <shutdownHook/> do konfiguracji należy zatrzymać kontekst.

Od logback docs:

<configuration> 
    <!-- in the absence of the class attribute, assume 
    ch.qos.logback.core.hook.DelayingShutdownHook --> 
    <shutdownHook/> 
    .... 
</configuration> 

I od DelayingShutdownHook summary:

realizacja ShutdownHook który zatrzymuje kontekst Logback po określonym czasie. Domyślne opóźnienie wynosi 0 ms (zero).

Powiązane problemy