「ログサーバーが止まりました」という悪夢
こんにちは!「リナックス先生」です。
前回までで、ログを自動で仕分けして保存する仕組みが完成しました。しかし、このまま放置するとどうなるでしょうか?
えっと、毎日ログが溜まっていくから…いつかハードディスクがいっぱいになりますか?
でも、1TBもあるし数年は大丈夫じゃないですか?
甘いわ!
ある日突然エラーログが大量発生して、一晩で数百GB埋まることだってあるのよ。
それに、生ログ(テキスト)のまま保存するのは容量の無駄。「Logrotate」を使って、毎日圧縮し、古いものを自動で捨てる仕組みを作るのがプロの常識よ。
1. 【重要】Rsyslog設定の「方針転換」
Logrotateの設定に入る前に、第3回で作った rsyslog.conf を少し見直します。
前回はRsyslog側で「日付入りファイル名(2026-01-09.log)」を生成するようにしました。
しかし、これをLogrotateで管理しようとすると、「ファイル名が毎日変わるため、設定が複雑になる」というデメリットがあります。
【プロの推奨構成】
実務では以下のように役割分担するのがベストプラクティスです。
- Rsyslog: 常に固定のファイル名(例:
current.log)に書き続ける。 - Logrotate: 深夜に
current.logをリネームして日付をつけ(例:20260109.log)、圧縮する。
Rsyslogテンプレートの修正
/etc/rsyslog.conf を開き、テンプレート部分を少し書き換えます。
vi /etc/rsyslog.conf
▼変更前(日付入りファイル名)
string="/var/log/remote/servers/%HOSTNAME%/%PROGRAMNAME%-%$YEAR%%$MONTH%%$DAY%.log"
▼変更後(固定ファイル名)
# ファイル名を固定化(current.log) template(name="TplServerLogs" type="string" string="/var/log/remote/servers/%HOSTNAME%/%PROGRAMNAME%.log") template(name="TplNetworkLogs" type="string" string="/var/log/remote/network/%fromhost-ip%/syslog.log")
書き換えたら再起動(systemctl restart rsyslog)しておきましょう。
これでLogrotateの設定が劇的にシンプルになります。
2. Logrotate設定ファイルの作成
Logrotateの設定ファイルは /etc/logrotate.d/ 配下に置きます。
リモートログ専用の設定ファイルを作成しましょう。
vi /etc/logrotate.d/rsyslog-remote
基本設定の記述
以下の内容を記述します。これが「教科書的」な設定です。
# 対象:/var/log/remote配下の全ての.logファイル
/var/log/remote/*/*.log {
daily # 毎日実行
rotate 366 # 366世代(約1年分)残す
missingok # ログがなくてもエラーにしない
notifempty # 空ファイルなら何もしない
compress # gzip圧縮する(容量節約!)
delaycompress # 圧縮を1日遅らせる(重要)
dateext # ファイル名に日付をつける (-20260109)
sharedscripts # スクリプトを1回だけ実行
# ローテーション後の処理(必須!)
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
endscript
}
【解説:HUPシグナルの重要性】
Linuxでは、ファイル名を変えても、プロセス(Rsyslog)は「元のファイル(の中身)」をつかみ続けて書き込みを続けます。postrotate で「HUPシグナル(設定再読み込み)」を送ることで、Rsyslogに「あ、ファイルが変わったのね、新しいファイルを開き直そう」と認識させるの。
これを忘れると、ログが虚空に消えるわよ!
3. 【Pro視点】「1年以上前のログ」をどうするか?
上記の設定だと、366日経過したログは「削除」されてしまいます。
しかし、監査要件で「ログは3年保存」と言われたらどうしますか?
サーバーのディスク容量にも限りがあります。
そこで、Logrotateの拡張機能 lastaction を使って、「削除される直前のログを、別のディスク(NFSや大容量HDD)へ移動させる」スクリプトを組み込みます。
アーカイブ用スクリプトの作成
まず、移動用スクリプトを作ります。
vi /usr/local/bin/archive_logs.sh
#!/bin/bash
# 引数 $1 には「削除されるログファイルのフルパス」が入る
LOG_FILE="$1"
ARCHIVE_DIR="/mnt/archive_disk" # NFSなどのマウントポイント
# ディレクトリ構造を維持して移動
DIR_NAME=$(dirname "$LOG_FILE")
SUB_DIR=${DIR_NAME#/var/log/remote/} # 相対パス抽出
mkdir -p "$ARCHIVE_DIR/$SUB_DIR"
mv "$LOG_FILE" "$ARCHIVE_DIR/$SUB_DIR/"
権限を付与します。
chmod +x /usr/local/bin/archive_logs.sh
Logrotateへの組み込み
先ほどの /etc/logrotate.d/rsyslog-remote の末尾に追記します。
# 削除される直前にスクリプトを実行
lastaction
/usr/local/bin/archive_logs.sh "$1"
endscript
}
これで、Logrotateが「このファイルもう古いから捨てるね」と判断した瞬間、削除する代わりにスクリプトが呼ばれ、アーカイブ領域へ移動されるようになります。
これが「容量節約」と「長期保存」を両立させるプロの技です。
4. 設定のテスト(ドライラン)
Logrotateは失敗するとログが消えてしまう危険な作業です。
必ずドライラン(テスト実行)を行いましょう。
# -d オプションでテスト(実際には実行されない) logrotate -d /etc/logrotate.d/rsyslog-remote
出力確認ポイント:
rotating pattern: ...が対象のファイルを正しく認識しているか?considering log ...で対象ファイルが見つかっているか?- エラーメッセージが出ていないか?
5. 強制実行と動作確認
テストで問題なければ、一度強制的に実行して動きを確認します。
# -f オプションで強制実行 logrotate -f /etc/logrotate.d/rsyslog-remote
その後、ディレクトリを確認してみましょう。
ls -l /var/log/remote/servers/ホスト名/
current.log(新しく作られた空のファイル)current-20260109.log.gz(圧縮された過去ログ)
このようになっていれば大成功です!
次回予告:最後の砦、バックアップ
お疲れ様でした!
これで「ログが溢れる」という心配はなくなりました。
- Rsyslogが固定ファイルに書き込む。
- Logrotateが毎日圧縮して日付をつける。
- 古くなったログは自動的にアーカイブ領域へ移動される。
完璧なサイクルですね。
しかし、もし「サーバーのディスク自体が故障」したら? アーカイブ領域も吹き飛ぶかもしれません。
最終回となる次回は、ログデータを物理的に別の場所(リモートサーバーやクラウドストレージ)へ転送する「NFSバックアップとrsyncによる同期」を構築し、システムを完成させます!
▼長期保存に耐える大容量VPS
ログの長期保存にはディスク容量が不可欠です。最近はSSDの大容量プランも安くなっています。アーカイブ用に別ディスクを追加できる(アタッチできる)VPSを選ぶのが賢い選択です。



コメント