2026年10月3日
2026年10月3日
rsyncのログをファイルに記録する方法と終了コード・logrotateでの管理
rsync でバックアップや同期を定期実行していると、「昨夜の同期は成功したのか」「どのファイルが転送・削除されたのか」を後から確かめたくなります。rsync にはログをファイルに書く --log-file オプションがあり、標準出力をリダイレクトするよりも、時刻とプロセスID付きの記録を残せます。
この記事のコマンドは rsync 3.x(2026年10月時点の主要な Linux ディストリビューションに入っている版)で確認できる仕様に基づいています。お使いの版は rsync --version で確認してください。
ログを残す2つの方法
| 方法 | 書き方 | 向いている用途 |
|---|---|---|
--log-file |
rsync -a --log-file=/var/log/rsync-backup.log 送り元 送り先 |
定期実行の記録。各行に日時とプロセスIDが付く |
| 出力のリダイレクト | rsync -a -i --stats 送り元 送り先 >> ログ 2>&1 |
画面に出る内容(統計やエラー)をそのまま残したいとき |
--log-file オプションを使う
rsync -a --delete \
--log-file=/var/log/rsync-backup.log \
/var/www/html/ backup@backup.example.com:/backup/www/
--log-file を指定すると、ファイルごとの記録が既定の書式 %i %n%L(変更内容の記号・ファイル名・シンボリックリンクの参照先)で追記されます。ログファイルは上書きではなく追記なので、実行ごとの記録がたまっていきます。
書式を変えたいときは --log-file-format を使います。
rsync -a \
--log-file=/var/log/rsync-backup.log \
--log-file-format='%i %n%L %l' \
/var/www/html/ backup@backup.example.com:/backup/www/
よく使うエスケープは次のとおりです。
| エスケープ | 意味 |
|---|---|
%i |
変更内容の記号(後述の itemize 形式) |
%n |
ファイル名 |
%L |
シンボリックリンクなら -> 参照先 |
%l |
ファイルの長さ(バイト) |
%b |
実際に転送したバイト数 |
%o |
操作の種類(send / recv / del. など) |
出力をリダイレクトする
画面に出る統計(--stats)やエラーメッセージも含めて残したい場合は、標準出力と標準エラー出力をファイルに追記します。
rsync -a -i --stats /var/www/html/ backup@backup.example.com:/backup/www/ \
>> /var/log/rsync-backup.out 2>&1
-i(--itemize-changes)は、更新したファイルごとに変更内容を1行で出します。--statsは、転送したファイル数やバイト数などの統計を最後に出します。--info=progress2や--progressは、端末上で進捗を書き換えながら表示するためのものです。ファイルに保存すると制御文字(復帰コード)が混ざって読みにくくなるので、ログ目的では付けないでください。
ログの読み方(itemize 形式)
%i の記号は11文字前後の文字列で、先頭の1文字が更新の種類、2文字目がファイルの種類を表します。
| 先頭の文字 | 意味 |
|---|---|
< |
リモートへ送ったファイル |
> |
ローカルに受け取ったファイル |
c |
ローカル側での作成・変更(ディレクトリやリンクの作成など) |
h |
ハードリンク |
. |
内容は更新していない(属性だけ変わることはある) |
* |
残りの部分がメッセージ(*deleting は削除) |
2文字目は f=ファイル、d=ディレクトリ、L=シンボリックリンクです。3文字目以降は変わった属性を表し、+ が並んでいれば新規作成、s はサイズ、t は更新時刻、p はパーミッションの変化です。
--log-file で残したログは、たとえば次のような行になります(ローカルからリモートへ送る場合)。
2026/10/15 03:30:01 [24817] building file list
2026/10/15 03:30:02 [24817] <f+++++++++ wp-content/uploads/2026/10/photo.jpg
2026/10/15 03:30:02 [24817] <f.st...... wp-config.php
2026/10/15 03:30:02 [24817] *deleting wp-content/cache/old.html
この例では、新しい画像を1件送り、wp-config.php のサイズと時刻が変わったため送り直し、--delete によって送り先の古いキャッシュを1件削除しています。
終了コードで成否を判定する
ログの文面を探すより、rsync の終了コードで判定する方が見落としが少なくなります。主な値は次のとおりです(rsync のマニュアルより)。
| 終了コード | 意味 |
|---|---|
| 0 | 成功 |
| 1 | 構文または使い方の誤り |
| 10 | ソケット入出力のエラー(接続の問題など) |
| 11 | ファイル入出力のエラー |
| 12 | rsync のプロトコルデータの異常 |
| 23 | エラーにより一部のファイルを転送できなかった |
| 24 | 転送中に送り元のファイルが消えたため一部を転送できなかった |
| 30 | データ送受信のタイムアウト |
| 35 | デーモン接続待ちのタイムアウト |
ウェブサイトのキャッシュやログのように実行中に消えるファイルがあると 24 になることがあります。24 を警告扱いにするか失敗扱いにするかは、対象に合わせて決めてください。
cronで使うスクリプトの例
ログの記録・終了コードの判定・結果の一覧をまとめたスクリプトです。送り元・送り先・ログの場所は環境に合わせて変えてください。
#!/bin/bash
# /usr/local/bin/rsync-backup.sh
set -u
SRC="/var/www/html/"
DEST="backup@backup.example.com:/backup/www/"
LOG="/var/log/rsync-backup.log"
SUMMARY="/var/log/rsync-backup-summary.log"
rsync -a --delete --timeout=600 \
--log-file="$LOG" \
"$SRC" "$DEST"
rc=$?
now=$(date '+%Y-%m-%d %H:%M:%S')
case "$rc" in
0) echo "$now OK" >> "$SUMMARY" ;;
24) echo "$now WARN 送り元のファイルが転送中に消えた (rc=24)" >> "$SUMMARY" ;;
*) echo "$now NG rc=$rc" >> "$SUMMARY" ;;
esac
exit "$rc"
sudo install -m 750 rsync-backup.sh /usr/local/bin/rsync-backup.sh
sudo /usr/local/bin/rsync-backup.sh; echo "exit=$?"
手動で一度実行し、終了コードとログを確認してから cron に登録します。/etc/cron.d/ に置くファイルは、/etc/crontab と同じく実行ユーザーの欄が必要です。
# /etc/cron.d/rsync-backup (毎日 3:30 に root で実行)
30 3 * * * root /usr/local/bin/rsync-backup.sh
リモートへの接続に SSH 鍵を使う場合は、cron から実行するユーザー(この例では root)の鍵で、パスワードなしで接続できることを事前に確かめてください。
logrotateでログを整理する
--log-file のログは追記され続けるので、logrotate で世代管理します。/etc/logrotate.d/rsync-backup を作ります。
/var/log/rsync-backup.log /var/log/rsync-backup-summary.log {
weekly
rotate 8
compress
delaycompress
missingok
notifempty
}
この設定では、週に1回ローテーションし、8世代(約2か月分)を残して古いものを削除します。delaycompress は直前の世代を圧縮せずに残すので、先週分をそのまま grep できます。設定の確認は、実際には変更しない -d で行います。
sudo logrotate -d /etc/logrotate.d/rsync-backup
ログを確認するコマンド
# 結果の一覧(直近10回)
tail -n 10 /var/log/rsync-backup-summary.log
# エラーの行を探す(rsync のエラーは "rsync:" や "rsync error:" で始まる)
grep -E 'rsync( error)?:' /var/log/rsync-backup.log
# 削除されたファイルの一覧
grep '\*deleting' /var/log/rsync-backup.log
# 特定の日の記録
grep '^2026/10/15' /var/log/rsync-backup.log
rsyncデーモン側でログを残す場合
rsync をデーモン(rsync:// で接続する方式)として動かしている場合は、サーバー側の /etc/rsyncd.conf でログを設定します。
log file = /var/log/rsyncd.log
transfer logging = yes
log file を指定しないとログは syslog に送られます。transfer logging = yes にすると、接続ごとの記録に加えて、転送したファイルごとの記録も残ります。設定を変えたら rsync デーモンを再起動してください(systemd では多くの場合 sudo systemctl restart rsync。サービス名はディストリビューションで異なります)。
注意点
- ログにはファイル名やディレクトリ構成が残ります。
chmod 640などで閲覧できるユーザーを限定してください。 --deleteを使う同期では、送り元の誤削除がそのまま送り先に反映されます。ログで*deletingの件数がふだんより多くないかを確かめると、事故に早く気づけます。世代を残したい場合は、別途バックアップの世代管理を行ってください。
関連記事:
まとめ
- 定期実行の記録は
--log-fileで残し、必要なら--log-file-formatで書式を変えます。統計やエラーを含めて残すなら出力をリダイレクトします。 - 成否はログの文面ではなく終了コード(0・23・24 など)で判定し、結果を一覧に記録します。
- ログは logrotate で世代管理し、
*deletingやエラー行を定期的に確認します。