Как я правильно Log4j, закрывая все Appenders и, следовательно, файлы

Мое веб-приложение на основе сервлета иногда не может закрыть файлы журнала Log4j при повторном развертывании, утечка в утечку дескриптора файла и иногда приводит к смерти, связанной с сервлетом, из "слишком большого количества открытых файлов".

У меня есть ContextListener, что я должен вставить в свой контекстDestroyed(), чтобы сообщить log4j о завершении и выпуске всех ресурсов?

Быстрый просмотр над javadocs показал класс Hierachery с методом shutdown(). Я понятия не имею, как на самом деле получить текущее Hierachery, и javadoc утверждает, что этот класс не имеет компонентов, обслуживаемых пользователем внутри:)

Ответы

Ответ 1

Попробуйте следующее:

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

Однако проблема, которую вы испытываете, странна и не должна происходить. Какую версию JVM, контейнера, log4j вы используете?

Ответ 2

У меня была такая же проблема, но для моего решения потребовалось два шага:

Во-первых, мне пришлось вызвать LogManager.shutdown() из метода сервлей destroy().

Затем мне пришлось исправить метод close() нашей собственной реализации Appender (который является подклассом AppenderSkeleton), так что он правильно закрывает appenders из getAllAppenders().