Нужно ли мне скрывать события при закрытии с помощью журнала?

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

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

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

Есть ли что-то подобное в logback или оно как-то автоматически срабатывает при завершении работы?

Mike

Ответы

Ответ 1

Здесь простой подход:

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

Ответ 2

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

Из logback docs:

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

И из Задержка отсрочкиShutdownHook:

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

Ответ 3

Мне не известно об отключении общего менеджера, как 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 и выполняет некоторые из тех же функций внутри, но я не использую его, поэтому я не могу комментировать его лучше, чем reset или нет.

Ответ 4

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

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