Хит производительности открытия и закрытия файлового обработчика?

У меня есть постоянная управляемая событиями программа загрузки HTTP (горячая папка), которая записывает в журнал каждое действие. Он работает бесконечно, пока пользователь не решит закрыть его.

Чтобы обеспечить закрытие журнала при закрытии приложения, я написал программу так, чтобы при каждой записи в журнал он открывал файл журнала, записывал в него, а затем закрывал журнал.

Вот так:

fh = new FileHandler(logName, true);
fh.setFormatter(new MyCustomFormatter());
logger.addHandler(fh);
logger.info(message);
logger.removeHandler(fh);
fh.close();

Недавно я рассмотрел вопрос об уменьшении количества открытий / закрытий, открывая журнал на время выполнения задания загрузки (возможно, сотни записей в журнал), а затем закрывая его после завершения задания.

Короче говоря, какой выигрыш в производительности я бы ожидал от этого? Существуют ли другие способы обеспечить закрытие приложения без открытого файла журнала?

1 ответ

Решение

Закрыв FileHandler, вы можете заплатить за синхронизацию.

Если вы оставите FileHandler подключенным к регистратору во время остановки JVM, LogManager закроет файл журнала. Если вы удалите обработчик из регистратора, вы несете ответственность за его закрытие. Если ваш регистратор мусора перед выключением, то FileHandler не закрывается. Этот тип "мусора файлов" может быть исправлен путем внесения изменений в ваш код.

Если ваша JVM дает сбой или есть исключение ввода-вывода, связанное с закрытием файла log / lck, то вы увидите, что остались файлы lck и файлы журнала, которые могут не содержать вашу хвостовую строку форматера. Это редкий случай, но предотвратить его невозможно. Вы должны применить обнаружение и правильную стратегию, чтобы избавиться от этих случаев.

Другие вопросы по тегам