Как мне правильно Log4j, закрывая все Appenders и, следовательно, файлы - PullRequest
15 голосов
/ 08 мая 2009

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

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

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

Ответы [ 2 ]

19 голосов
/ 08 мая 2009

Попробуйте это:

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

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

1 голос
/ 15 ноября 2010

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

Сначала я должен был вызвать LogManager.shutdown() из метода сервлетов destroy().

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

...