【Rsyslog基礎 第4回】運用編 – ディスクパンクを防げ!Logrotateによる「ログの圧縮・世代管理」完全ガイド

Linux

「ログサーバーが止まりました」という悪夢

こんにちは!「リナックス先生」です。
前回までで、ログを自動で仕分けして保存する仕組みが完成しました。しかし、このまま放置するとどうなるでしょうか?

コウ君

えっと、毎日ログが溜まっていくから…いつかハードディスクがいっぱいになりますか?
でも、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 (圧縮された過去ログ)

このようになっていれば大成功です!


次回予告:最後の砦、バックアップ

お疲れ様でした!
これで「ログが溢れる」という心配はなくなりました。

  1. Rsyslogが固定ファイルに書き込む。
  2. Logrotateが毎日圧縮して日付をつける。
  3. 古くなったログは自動的にアーカイブ領域へ移動される。

完璧なサイクルですね。
しかし、もし「サーバーのディスク自体が故障」したら? アーカイブ領域も吹き飛ぶかもしれません。
最終回となる次回は、ログデータを物理的に別の場所(リモートサーバーやクラウドストレージ)へ転送する「NFSバックアップとrsyncによる同期」を構築し、システムを完成させます!

▼長期保存に耐える大容量VPS

ログの長期保存にはディスク容量が不可欠です。最近はSSDの大容量プランも安くなっています。アーカイブ用に別ディスクを追加できる(アタッチできる)VPSを選ぶのが賢い選択です。

【2026年最新】Linuxサーバー構築におすすめのVPS比較3選!現役エンジニアが速度とコスパで厳選
Linuxの勉強、まだ「自分のPC」でやって消耗していませんか?「Linuxを覚えたいけど、環境構築でエラーが出て先に進めない…」「VirtualBoxを入れたらパソコンが重くなった…」これは、Linux学習を始める9割の人がぶつかる壁です...

コメント