почему файл .lck создается, а не удаляется при ведении журнала java - PullRequest
3 голосов
/ 20 апреля 2011

Я пытаюсь реализовать регистратор уровня приложений (веб-приложения, развернутые в weblogic) - с использованием java.util.logging.

Я взял ClassLoaderLogManager из системы регистрации JULI apache, поскольку она уже реализует ведение журнала на уровне приложения.

Вот так выглядит мой код сервлета ( SimpleServlet .java):

ClassLoaderLogManager ClassLoaderLogManager = new ClassLoaderLogManager () ;
String nameoflogger = SimpleServlet.class.getName() ;   
boolean status = ClassLoaderLogManager .addLogger(nameoflogger);   
if(status) 
{
     Logger logger = ClassLoaderLogManager .getLogger(nameoflogger);   
     logger.log(Level.FINEST, "testing SimpleServlet FINEST");
     logger.log(Level.INFO, "testing SimpleServlet INFO");
     logger.log(Level.SEVERE, "testing SimpleServlet SEVERE");   
}    
ClassLoaderLogManager .reset();  

И у меня есть файл logging.properties в java_home / jre / lib следующим образом

handlers= java.util.logging.FileHandler

#.level= INFO

# default file output is in user's home directory.

java.util.logging.FileHandler.pattern = %h/java_%g.log
java.util.logging.FileHandler.limit = 200
java.util.logging.FileHandler.count = 10
java.util.logging.FileHandler.append  = true
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter


# Limit the message that are printed on the console to INFO and above.
#java.util.logging.ConsoleHandler.level = INFO
#java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

package8.SimpleServlet.handler = java.util.logging.FileHandler

############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

# For example, set the com.xyz.foo logger to only log SEVERE
# messages:
package8.SimpleServlet.level = SEVERE

Поэтому, когда я запускаю веб-приложение - и когда я получаю доступ к веб-приложению, я ожидаю, что будут созданы java_0.log, java_1.log (ротация файла журнала) - и т. Д. Но я также вижу java0.log.lck, java1.log.lck.

В файлах журналов отображаются только журналы уровня SEVERE, как и ожидалось.

Почему это происходит? Если у меня есть создание обработчика на стороне кода Java, закрытие обработчика решит проблему. Купить у вас не обрабатывается здесь?

Или это потому, что я использую, использую java.util.logging.FileHandler , а не org.apache.juli.FileHandler при использовании org.apache.juli. ClassLoaderLogManager ??

1 Ответ

2 голосов
/ 15 ноября 2013

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

Возможно, вы работаете с JDK-8060132 Обработчики, настроенные на абстрактных узлах в logging.properties, не всегда правильно закрыты. Related: JDK-6274920: Регистратор JDK содержит строгую ссылку на java.util.logging.Logger instance.

Если посмотреть на конфигурацию, у вас есть FileHandler, установленный в корневом логгере, и FileHandler, установленный в SimpleServlet.Поскольку ClassLoaderLogManager не используется глобальным способом JVM, установленный по умолчанию LogManager создает FileHandlers перед запуском локального ClassLoaderLogManager.Удалите записи FileHandler из имеющегося у вас jav_home / jre / lib comfig и используйте методы ClassLoaderLogManager.readConfiguration для загрузки локальной конфигурации webapp.

...