Rsyncはログファイルを回転させます。

Rsyncはログファイルを回転させます。

現在私には困難な問題がある。これを調べるにはかなり時間がかかります。とにかく、私がすることは次のとおりです。

複数のサーバーからログファイルを収集してrsyncアーカイブします。保持時間属性が重要なので、私が使用しているアーカイブモードを使用してくださいrsync。ただし、場合によってはエラーが発生する可能性があります。

問題は、ログファイルがサーバー上で循環(変更)されることです。

したがって、現在使用されているログには次のように名前が付けられますtest.log(編集されていませんrsync)。ログファイルは、一定期間および/または特定のファイルサイズの後に循環します。test.log名前が変更されることを意味しますtest.log.1。もう一度test.log回転するとtest.log.1名前test.log.2test.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
  2. ログが回転しています(test.log.1名前が付けtest.log.2られており、.2現在.3)。
  3. rsync収集開始(test.log.1およびtest.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 ....

関連情報