Проблема с FileAppender в Log4j на сервере Tomcat - PullRequest
6 голосов
/ 12 февраля 2011

Я работаю над веб-приложением, и у меня есть требование для создания файлов журнала во время выполнения для моего процесса impex. Вот пример использования Я проверяю файл XML, и ошибка проверки обрабатывается пользовательским обработчиком ошибок. Эта ошибка hanlde будет передана в базовый валидатор (Jaxb 2.x validator), поэтому мне нужно создать файл журнала, когда экземпляр этого обработчика ошибок создается мы используем log4j в качестве API логирования

вот код для создания файла журнала во время выполнения

XMLErrorHandler<Object> errorHandler=new XMLErrorHandler<Object>(logFileLocation);
        logFileName=errorHandler.getLogFileName();
        validator.setErrorHandler(errorHandler);
            validator.validate(source);

я создаю файл журнала внутри конструктора XMLErrorHandler, так как это единственная точка, которой я могу управлять здесь, это код для создания файла журнала

FileAppender appender;
            try {
                appender = new FileAppender(layout, sb.toString(), false);
                log.addAppender(appender);
                log.setAdditivity(false);
                log.setLevel(Level.WARN);
            } catch (IOException e) {
                e.printStackTrace();
            }

все работает нормально, файл создается правильно и записывается регистратором в соответствующее место. но если я перезагружаю свой сервер, начинается настоящая проблема, и регистратор начинает добавлять содержимое журнала не только в свой текущий файл журнала, но также и для всех файлов, создаваемых для этого процесса во время работы сервера. Вот подробности Предположим, у меня уже есть 3 файла журнала (A, B, C), которые уже находятся в этом месте, по 3 строки в каждом файле журнала, а C был последним файлом, созданным в процессе. поэтому, когда я перезагружаю свой сервер (под рестартом я имею в виду, что я остановил tomcat из консоли), это как-то добавляет данные в предыдущие файлы всех журналов в этой фашине. C имеет еще 3 строки B теперь имеет 6 строк А теперь имеет 9 строк

Похоже, что созданный мной appender все еще открыт или имеет ссылку, не уверен, что именно происходит. любая помощь в этом отношении будет полезна.

Ответы [ 3 ]

1 голос
/ 14 февраля 2011

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

0 голосов
/ 28 февраля 2014

до log.addAppender(appender); вы можете написать log.removeAllAppenders();

0 голосов
/ 13 февраля 2011

Нужна дополнительная информация. Когда вы говорите «перезапустите мой сервер», означает ли это, что вся JVM перезапускается или только потоки внутри JVM? У меня была проблема, похожая на эту, с пользовательским демоном. Когда я думал, что сервер был перезапущен, он фактически не убивал предыдущие экземпляры демона и JVM, поэтому у меня было несколько запущенных, обновляемых и конфликтующих экземпляров.

...