Java перемещает файл во время записи - PullRequest
0 голосов
/ 22 февраля 2012

мое java-приложение должно считывать данные журналирования приложения Snort на сервере Debian.Приложение Snort работает независимо от моего оценочного приложения и записывает его логи в файл.Предполагается, что мое приложение для проверки будет проверять только новый контент каждые 5 минут.Вот почему я перенесу файл журнала, чтобы приложение Snort создавало новый файл, а мое приложение могло проверять уже записанные данные из старого.

Теперь вопрос: как я могу убедиться, что я нене уничтожить файл в том случае, если я перенесу его в тот момент, когда приложение Snort пишет на нем?Имеет ли Java функциональность для проверки текущих действий с файлом, чтобы не потерять данные?Блокирует ли ОС файл во время записи?

Спасибо за помощь, Kn0rK3

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Это не должно быть проблемой.Как правило, приложение регистрации имеет своего рода дескриптор файла или поток, открытый для файла.Если файл переименовывается, это никак не влияет на приложение для записи - имя не зависит от содержимого файла или его расположения на диске.Snort должен продолжать запись в новое имя файла до тех пор, пока не заметит, что файл был переименован, после чего он заново открывает новый файл журнала со старым именем и переключается на запись в него.

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

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

ЕдинственноеВы должны беспокоиться о том, что вы переименовываете файл в имя файла, который еще не существует.Я бы порекомендовал переместить его на расширение .YYYYMMDD.HHMMSS или что-то в этом роде.

ПРИМЕЧАНИЕ: В многопоточных операциях ведения журнала, даже если новый файл был открыт, возможно, вам придется немного подождатьвсе потоки для переключения на новый поток регистрации.Я не уверен, как работает Snort, но я видел рост файла log.YYYYMMDD даже после повторного открытия файла log.Я просто подожду минуту, прежде чем использовать переименованный файл журнала.FYI.

1 голос
/ 22 февраля 2012

Не совсем то, что вы ищете, но я бы сделал это совсем по-другому.Либо путем записи номера строки / метки времени последней записи, прочитанной из файла журнала, либо позиции в RandomAccessFile (второй вариант более эффективен по очевидным причинам), и при следующем чтении файла., делайте это только из записанной позиции в EOF (в которой вы можете снова записать последнюю позицию чтения).

Кроме того, вы можете заменять «пул каждые 5 минут» на «пул» каждый разЯ получаю уведомление об обновлении"для этой файловой стратегии.

Поскольку я предполагаю, что у вас нет контроля над кодом приложения "Snort", я не думаю, что NIO FileLock s поможет вам.

...