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

example.log.2014-01-17--00

а также

example.log.2014-01-17--00.gz

это тот же лог-файл, но упакованный с помощью gzip -9.

это моя строка rsync, она включена в скрипт:

rsync -rvzt --include "*/" --include "$pattern" --exclude "*" $directory loguser@123.456.789.000:/home/loguser/logstorage/$subdir/$basefilename

он выполняется crontab каждый час и передает все файлы, соответствующие $ pattern и $ directory, включенные в файл, который содержит пути и шаблоны, которые я хочу передать.

Поэтому мой вопрос: есть ли опция rsync, которую я не видел, или есть ли возможность сделать это и как.

Заранее спасибо.

2 ответа2

0

Хорошо, я объясню немного больше о моей среде и о том, что я ищу:

У меня есть среда, в которой столько лог-файлов, эти лог-файлы вращаются в зависимости от своего веса, поэтому не все лог-файлы вращаются, у меня также есть много разных путей, где находятся эти лог-файлы, и эти лог-файлы узороподобный по имени.

Это пример файла, содержащего пути, имена, время ZIP и DEL:

# all entries in this file are logfile directories.
# Report: NO # Specify if you want to receive result by mail, options (YES/NO)
# These files will be zipped after <ZIP> days and deleted after <DEL> days
# If <DEL> is not specified, no files will be deleted
# Format: <DIR> <FILEPATTERN> <ageInDaysBeforeBZIP> [<ageInDaysBeforeDELETE>]
# Example: /home/loguser/logstorage       "PATTERN"       <ZIP>    <DEL>
#
/home/user1/www/logs/                     "example.log*"    3        30

В этом случае скрипт будет читать и переносить пути в переменную $directory , переносить pattern в переменную $pattern а ZIP & DEL будет использоваться для zip-файлов журнала старше 3 дней и удалять старые файлы журнала старше 30 дней, но это еще одна часть сценария.

Поэтому мне нужно перенести текущие журнальные файлы ежечасно на конечный сервер, но я не могу использовать --delete , потому что на конечном сервере мне нужно хранить лог-файлы в течение 90 дней.

Итак, я создал этот скрипт, который работает каждый час и передает соответствующие файлы шаблонов на целевой сервер.

На обоих серверах есть еще один cronjob для "поддержания чистоты комнаты", запускаемый один раз в день и архивирующий лог-файлы старше 1 дня и удаляющий те, которые старше 90 дней, но он не может выполнить свою работу, потому что если он попытается выполнить gzip -9 example.log.2014-01-17--12 не может этого сделать, файл существует, потому что был заархивирован в источнике и передан в пункт назначения.

Я понимаю, что если я добавлю или изменю --exclude "* .gz" вместо --exclude "*.gz" --exclude "*" заархивированные файлы не будут переданы, в любом случае, они будут заархивированы по назначению и проблема решена, я думаю, но мне нужно убедитесь, что есть одинаковые файлы с одинаковой суммой md5, потому что там очень много важных лог-файлов.

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

Если вам нужно больше объяснений, пожалуйста, дайте мне знать.

0

Рассматривали ли вы использование пересылки rsyslog [1]?

Кроме того, из [2] похоже, что добавление --exclude '*.gz' должно решить вашу проблему. Почему вы --exclude '*'? Мое чтение этого было бы то, что каждый файл исключен из синхронизации.

[1] http://www.rsyslog.com/storing-and-forwarding-remote-messages/

[2] http://www.thegeekstuff.com/2011/01/rsync-exclude-files-and-folders/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .