Закрытие log4j Logger для выпуска дескриптора файла - PullRequest
4 голосов
/ 09 марта 2012

Я написал Сервер, который получает запросы RMI и выполняет некоторые операции.

Для каждого запроса создается экземпляр Log4J Logger. Ниже приведен фрагмент кода, который используется для создания экземпляра Logger.

Logger log = Logger.getLogger("log_" + requestID);
log.setAdditivity(false);
FileAppender appender = null;
try {
    PatternLayout layout = new PatternLayout("%-5p %C{1} %d{yyyy-MM-dd HH:mm:ss} : %m%n");
    appender = new FileAppender(layout, logFileName, false);
} catch(Exception e) {
    logger.error("Error initializing logger", e);
}

log.addAppender(appender);
log.setLevel(level);

Здесь все отлично работает. Проблема заключается в том, что после получения большого количества запросов происходит сверхурочное время, число открытых файлов для этого серверного процесса увеличивается и не снижается, что приводит к сбою процесса с исключением: 1006 * слишком много открытых файлов .

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

Есть идеи здесь?

Ответы [ 2 ]

6 голосов
/ 09 марта 2012

Взгляните на документацию FileAppender.close () , возможно, это решит вашу проблему.

Но я думаю, что вы должны пересмотреть свой дизайн и иметь только один экземпляр Loggerнет?

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

Сделайте ваш логгер окончательным статическим должно решить проблему:

private final static Logger logger = Logger.getLogger(YOURCLASS.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...