Вращающиеся лог-файлы Rsync

в настоящее время у меня проблема. Мне нужно было достаточно времени для определения этой проблемы. Во всяком случае, это то, что я делаю:

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

Проблема в том, что файлы журналов вращаются (меняются) на серверах.

Таким образом, текущие журналы, которые используются, называются test.log (они не получают rsync ed). Через некоторое время и / или определенный размер файла файл журнала вращается. Значение test.log переименовывается в test.log.1 . Теперь, когда test.log снова повернут, test.log.1 переименовывается в test.log.2 а test.log переименовывается в test.log.1 .

Я думаю, что когда test.log перейдет непосредственно в test.log.2 , test.log.2 не возникнет. Но это то, что я не могу изменить.

И именно это вращение происходит как-то (иногда) именно тогда, когда я rsync ing. Таким образом, rsync получает все атрибуты времени файлов, затем происходит ротация, а затем rsync начинает собирать лог-файлы. Но теперь, например, test.log.1 больше не тот же файл. Но rsync все равно получает. В конце rsync не может удалить файл на сервере, потому что он изменился (я вижу это в отладке rsync ). Надеюсь, это объяснение имеет смысл.

Возможно, небольшой поток процесса:

  1. rsync получает список файлов с атрибутами времени ( test.log.1 и test.log.2 ) (это то, что, я считаю, происходит, я точно не знаю, как работает «rsync»)
  2. журналы test.log.1 ( test.log.1 теперь называется test.log.2 и .2 ) .3 )
  3. rsync начинает сбор ( test.log.1 и test.log.2 )
  4. rsync не может удалить указанный файл

Так есть ли какой-либо вариант, который мешает этому?

Эта проблема лучше всего решать на этапе вращения, а не на этапе копирования и архивирования. Если вы измените поворот журнала на дату, а не передадите ему порядковые номера, тогда архивирование rsync не нуждается в какой-либо логике для правильной работы Thing ™.

Предполагая, что вы уже используете логротат для вращения, это можно сделать с dateext параметра dateext . Но если приложение управляет собственным вращением, его может быть сложнее настроить. Я знаю, что log4j также может добавлять даты к повернутым файлам, но это может не отображаться через конфигурацию, и поэтому может потребоваться изменение приложения. Вы также можете отключить вращение на уровне приложения и вместо этого использовать logrotate.

В конце передачи rsync проверяет, что файл, который он передал, совпадает с тем, который был запущен. Если файлы не совпадают, они предупреждают вас и переходят к следующему. Если у вас есть --remove-source-files он не удалит файл, который, по его мнению, был неправильно или не полностью передан.

При условии, что есть окно возможностей, во время которого rsync может успешно перенести файлы журнала, нет никакого большого вреда повторять rsync чаще – или даже повторять его до тех пор, пока это не удастся:

 k=3 while test 0 -lt $k && k=$((k-1)) do rsync .... && break sleep 10 done 

Если это не сработает для вас, вам нужно подумать о том, как вы можете «моментально копировать» файлы журнала достаточно долго, чтобы копировать:

 ssh -q remote_host 'mkdir -p rsync.tmp; cp -p *.log rsync.tmp/' rsync -a --remove-source-files remote_host:/path/to/logs/rsync.tmp/*.log ....