目前我有一个麻烦的问题。我需要相当长的时间来确定这个问题。无论如何,这就是我正在做的事情:
我从多个服务器收集日志文件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
调试中看到了这一点)。我希望这个解释是有道理的。
所以也许是一个小的流程:
rsync
test.log.1
获取带有时间属性(和)的文件列表test.log.2
(这就是我相信正在发生的事情,我不知道“rsync”到底是如何工作的)- 日志正在旋转(
test.log.1
现在命名为test.log.2
and.2
now.3
) rsync
开始收集 (test.log.1
和test.log.2
)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 ....