Ведение журнала из события уничтожения контекста сервлета

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

Я попытался реализовать интерфейс ServletContextListener для этого:

public class DiagnosticListener
    implements ServletContextListener {

    private static final Logger LOG = LogManager.getLogger(DiagnosticListener.class);

    @Override
    public void contextInitialized( final ServletContextEvent sce ) {
        LOG.info("Context initialized.");
    }

    @Override
    public void contextDestroyed( final ServletContextEvent sce ) {
        LOG.info("Context destroyed.");
    }
}

Событие инициализации регистрируется, как и ожидалось, но событие уничтожения никогда не появляется. Я предполагаю, что это связано с тем, как log4j2 управляет своим жизненным циклом, используя аналогичный прослушиватель, что инфраструктура ведения журнала больше недоступна во время этого события.

Есть ли способ зарегистрировать событие закрытия приложения?


person Paul Turner    schedule 01.06.2016    source источник


Ответы (2)


Мы столкнулись с аналогичной проблемой с Logback. Вы должны написать свой собственный web.xml, чтобы исправить это, потому что нет альтернатив для определения порядка слушателей.

Мы отключили LogbackServletContextListener с помощью:

<context-param>
    <param-name>logbackDisableServletContainerInitializer</param-name>
    <param-value>true</param-value>
</context-param>

затем вручную добавьте LogbackServletContextListener в качестве первого слушателя:

<listener>
    <listener-class>ch.qos.logback.classic.servlet.LogbackServletContextListener</listener-class>
</listener>

а затем и все остальные слушатели.

Понятия не имею о log4j, но я думаю, что есть что-то подобное...

изменить: да, есть:

<context-param>
    <param-name>isLog4jAutoInitializationDisabled</param-name>
    <param-value>true</param-value>
</context-param>

источник: https://logging.apache.org/log4j/2.x/manual/webapp.html

person ndr_brt    schedule 13.04.2018

Если вы настроили ServletContextListener Log4j перед вашим в web.xml, тогда Log4j должен быть инициализирован до вашего ServletContextListener и остановлен после вашего.

person rgoers    schedule 01.06.2016
comment
Я работаю в контейнере Servlet 3.0 и не выполнял ручную настройку компонентов сервлета Log4j. - person Paul Turner; 01.06.2016