Нужно ли сбрасывать события при выключении через logback? - PullRequest
14 голосов
/ 09 сентября 2010

Мы переходим к выходу из log4j для нескольких веб-приложений. В закрытии нашего приложения мы в настоящее время называем:

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

Что должно очистить все асинхронные журналы и закрыть все внешние ресурсы (файлы, сокеты).

Есть ли что-то похожее в logback или оно автоматически сбрасывается при выключении?

Mike

Ответы [ 4 ]

7 голосов
/ 04 мая 2011

Вот простой подход:

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 голосов
/ 24 июля 2015

Похоже, что простое добавление <shutdownHook/> в конфигурацию должно остановить контекст.

Из Документы logback :

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

И из Сводка по DelayingShutdownHook:

Реализация ShutdownHook, которая останавливает контекст Logback после указанной задержки.Задержка по умолчанию составляет 0 мс (ноль).

0 голосов
/ 12 сентября 2017

Версия 1.1.10 и далее, logback обеспечивает остановку текущего классического контекста logback, когда веб-приложение останавливается или перезагружается.

Вот обновленный документ: https://logback.qos.ch/manual/configuration.html#webShutdownHook

0 голосов
/ 09 сентября 2010

Я не знаю об общем отключении менеджера, как log4j, но я закрываю все свои индивидуальные регистраторы контекста, когда их контекст уничтожается, используя ServletContextListener, например так:

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);
}

Также, LoggerContext.stop ()svailable и выполняет некоторые из тех же внутренних функций, но я им не пользуюсь, поэтому я не могу комментировать, лучше ли это, чем сброс или нет.

...