Log4J RollingFileAppender Не удается открыть файл

Я пишу небольшой слой преобразования xml в Java. Я получаю xml через веб-службу, изменяю ее, а затем отправляю измененный xml в другую систему. Затем я жду ответа и возвращу ответ на исходный вызывающий.

System A -> Me -> System B -> Me -> System A

Я хочу зарегистрировать запрос, который я получаю, запрос, который я отправляю, ответ, который я получаю, и запрос, который я отправляю. В основном я хочу зарегистрировать xml, где каждая стрелка находится на моей диаграмме.

Моя проблема с RollingFileAppender. Я пытаюсь свернуть на 10 МБ, иногда это происходит, а иногда и не катится. Если он катит пару раз, а затем останавливается, он будет продолжать переименовывать свернутые файлы с 3 на 4 и 4 на 5 и т.д.

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

ИЗМЕНИТЬ Вот мой файл свойств.

log4j.rootLogger=DEBUG, fileOut

log4j.appender.fileOut=org.apache.log4j.RollingFileAppender
log4j.appender.fileOut.File=/logs/log.log
log4j.appender.fileOut.layout=org.apache.log4j.PatternLayout
log4j.appender.fileOut.layout.ConversionPattern=%d %-5p %c - %m%n
log4j.appender.fileOut.MaxFileSize=10MB
log4j.appender.fileOut.MaxBackupIndex=10
log4j.appender.fileOut.append=true

РЕДАКТИРОВАТЬ 2 Это, по сути, рельеф, так как этот пост имеет небольшое количество просмотров. Я чувствую, что это не может быть уникальной проблемой. Буду признателен за любую оказанную помощь. Спасибо!

Ответ 1

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

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

Все становится проблематичным, если у вас есть две (или более) области конфигурации Log4J ", используя тот же физический файл для конфигурации скользящего приложения. Это может быть:

  • Два разных веб-приложения на одном физическом JVM
  • Два разных веб-приложения на двух разных JVM
  • Одно и то же веб-приложение, горизонтально кластерное на двух разных JVM

(и т.д.)

Log4J просто не знает, кто еще, кроме него в пределах одного и того же конфигурационного пространства Log4J, использует этот файл. Итак, что происходит, так это то, что Log4J в System A пытается свернуть файл (потому что он думает, что другие процессы не обращаются к этому файлу) и не удается, потому что кто-то из System B использует этот файл в то же время.

Это известное ограничение использования файловых добавок, и вы не можете обвинять Log4J в этом: Log4J просто не имеет средств для мониторинга того, кто еще, кроме Log4J в том же "царстве конфигурации", использует этот файл.

Для такого сценария использования вы можете использовать приложение сокетов Log4J.

Если ваш сценарий не включает несколько областей конфигурации Log4J, попробуйте добавить -Dlog4j.debug=true в параметры JVM и посмотреть, что именно происходит во время операции проката файлов.

Ответ 2

Я также столкнулся с той же проблемой в своем приложении.

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

Ответ 3

Для других, которые прибывают сюда, убедитесь, что вы используете RollingFileAppender NOT FileAppender!

Вырезать и вставлять ошибки слишком легко, по крайней мере для меня.