Rsync 轮换日志文件

Rsync 轮换日志文件

目前我有一个麻烦的问题。我需要相当长的时间来确定这个问题。无论如何,这就是我正在做的事情:

我从多个服务器收集日志文件rsync来存档它们。保留时间属性很重要,因此我使用 的存档模式rsync。但在某些情况下这会导致一些错误。

问题在于日志文件在服务器上轮换(更改)。

因此,当前正在使用的日志的命名方式如下test.log(它们没有被rsync编辑)。经过一段时间和/或特定的文件大小后,日志文件将轮换。含义test.log更名为test.log.1.现在,当test.log再次旋转时,test.log.1被重命名为test.log.2并被test.log重命名为test.log.1

我想什么时候test.log直接去test.log.2,就没有问题了。但这是我无法改变的。

而这种轮换正是在我正在rsync飞行时以某种方式(有时)发生的。因此,rsync获取文件的所有时间属性,然后进行轮换,然后rsync开始收集日志文件。但现在例如test.log.1不再是同一个文件了。但rsync无论如何还是得到了。最后rsync无法删除服务器上的文件,因为它发生了变化(我在rsync调试中看到了这一点)。我希望这个解释是有道理的。

所以也许是一个小的流程:

  1. rsynctest.log.1获取带有时间属性(和)的文件列表test.log.2(这就是我相信正在发生的事情,我不知道“rsync”到底是如何工作的)
  2. 日志正在旋转(test.log.1现在命名为test.log.2and .2now .3
  3. rsync开始收集 (test.log.1test.log.2)
  4. rsync无法删除特定文件

那么有什么选择可以防止这种情况发生吗?

答案1

这个问题最好在轮换阶段解决,而不是在复制归档阶段。如果您更改日志轮换以记录文件的日期而不是为它们提供序列号,则 rsync 归档不需要任何逻辑来执行正确的操作™。

假设您已经使用 logrotate 进行轮换,那么可以使用该dateext选项来完成此操作。但如果应用程序管理自己的轮换,则配置可能会更困难。我知道 log4j 还可以将日期附加到轮换文件中,但这可能不会通过配置公开,因此可能需要更改应用程序。您还可以关闭应用程序级轮换并使用 logrotate。

答案2

传输结束时,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 ....

相关内容