現在私には困難な問題がある。これを調べるにはかなり時間がかかります。とにかく、私がすることは次のとおりです。
複数のサーバーからログファイルを収集して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
。- ログが回転しています(
test.log.1
名前が付けtest.log.2
られており、.2
現在.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 ....