Нужно ли сбрасывать события при выключении через logback?
Мы переходим на logback из log4j для нескольких веб-приложений. При закрытии нашего приложения мы в настоящее время называем:
org.apache.log4j.LogManager.shutdown();
Который должен очистить все асинхронное ведение журнала и закрыть все внешние ресурсы (файлы, сокеты).
Есть ли что-то похожее в logback или оно автоматически сбрасывается при выключении?
Майк
4 ответа
Кажется, что просто добавив <shutdownHook/>
в конфигурации должен остановить контекст.
Из документации по входу в систему:
<configuration>
<!-- in the absence of the class attribute, assume
ch.qos.logback.core.hook.DelayingShutdownHook -->
<shutdownHook/>
....
</configuration>
И из краткого обзора DelayingShutdownHook:
Реализация ShutdownHook, которая останавливает контекст Logback после указанной задержки. Задержка по умолчанию составляет 0 мс (ноль).
Вот простой подход:
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();
}
Начиная с версии 1.1.10 logback обеспечивает остановку текущего классического контекста logback, когда веб-приложение останавливается или перезагружается.
Вот обновленный документ: https://logback.qos.ch/manual/configuration.html
Я не знаю об общем отключении менеджера, как 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 и выполняет некоторые из тех же функций внутренне, но я не использую его, поэтому я не могу комментировать, лучше ли это, чем сброс или нет.