java.util.logging FileHandler.count не работает

Я использую java.util.logging для проекта, и у меня проблема с конфигурацией. У меня есть файл logging.properties, который, как я знаю, читается, потому что, например. изменения уровня и шаблона файлового обработчика вступают в силу.

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

java.util.logging.FileHandler.pattern = server.log
java.util.logging.FileHandler.limit = 500000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.append = false
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

В результате файлы создаются как server.log.1, server.log.2 и т. д. В идеале я не хочу, чтобы добавление было истинным (похоже, это не имеет значения...), я просто хочу новый журнал файл, который будет создаваться каждый раз, когда я запускаю свою программу, потенциально перезаписывая существующий файл. В любое время в моем каталоге должно быть не больше файлов журналов count.

Изменение добавления и подсчета, похоже, не имеет никакого значения. Использование %u и %g и т. д. в шаблоне также не имеет большого значения. Я все еще получаю файлы server.log.n, которые загромождают каталог.

Каждый созданный файл также имеет сопутствующий файл .lck. Почему они созданы и могут ли они быть виновниками?

Изменить:

Не знаю, почему я не пробовал это раньше, но удаление файлов .lck вручную приводит к тому, что все работает так, как хотелось бы. Итак, теперь действительно возникает вопрос: почему создаются файлы .lck (неправильное завершение работы?) и как с этим справиться?


person UmaN    schedule 04.03.2014    source источник
comment
Файлы блокировки удаляются при закрытии FileHandler. Обычно FileHandler закрывается, когда завершается перехватчик выключения j.u.l.LogManager$Cleaner. Вы упомянули, что принудительно завершаете работу с помощью cltr-c. Я бы предположил, что в этом случае хук выключения не выполняется.   -  person jmehrens    schedule 06.03.2014
comment
Как вы указываете, конструктор LogManager делает: Runtime.getRuntime().addShutdownHook(new Cleaner()); . Это должно перехватывать отключения типа ctrl-c.   -  person UmaN    schedule 06.03.2014


Ответы (1)


Это происходит только тогда, когда FileHandler обнаруживает, что файл server.log заблокирован. Либо у вас одновременно запущены две JVM, либо одновременно открыты два экземпляра FileHandler, указывающие на одно и то же имя файла, либо другой процесс блокирует файл server.log до открытия FileHandler.

Связанный: Является ли java.util.logging.FileHandler в Java 8 не работает?, JavaLogger случайным образом записывает во второй файл и FileLock.

person jmehrens    schedule 04.03.2014
comment
Кажется, это может быть правдой. Однако... Я запускаю свой сервер из скрипта в среде cygwin. Принудительное завершение работы с помощью cltr-c не оставляет никаких процессов. Я могу снова запустить сервер и без проблем подключиться к тому же порту. Тогда я могу только представить, что это проблема Cygwin. Но нет проблем просто удалить файлы журнала, они не кажутся заблокированными... - person UmaN; 05.03.2014
comment
Я добавил ссылку на ответ. Зарегистрируйте pid JVM при запуске, затем сравните идентификаторы в каждом файле журнала. - person jmehrens; 05.03.2014
comment
Я добавил код для этого, но я не понимаю, что я должен сравнивать? PID в файлах журнала отличаются, и впоследствии ps не показывает, что ни один из этих процессов еще не запущен. - person UmaN; 06.03.2014
comment
Возможно, cygwin не выполняет блокировку файлов должным образом. Удалите все файлы журнала и lck. Выполните один запуск и одну остановку вашей работы. Какие файлы остались и какие в них PID? - person jmehrens; 07.03.2014