【logrotate講座 第1回】サーバーの「時限爆弾」を解除せよ!ログローテーションの基礎と仕組み完全図解

「ログ」は、放っておくと「ゴミ」になる。

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
今回から全8回にわたり、地味だけれどもサーバー管理者にとって「最も重要」と言っても過言ではないツール、「logrotate(ログローテート)」の集中講座をスタートします!

Webサーバーもデータベースも、稼働している限り必ず「ログ」を吐き出し続けます。
正常に動いている時は「記録」ですが、放置すればそれは無限に増え続ける「ゴミ」となり、最終的にはサーバーのディスクを食いつぶしてシステムを停止させます。
いわば、ログはサーバーに仕掛けられた時限爆弾なのです。

コウ君

先生、脅かさないでくださいよ!
でも確かに、この前テストで作ったサーバー、久しぶりにログインしたら「No space left on device」って出て何もできなくなってました…。
あれってログのせいだったんですか? 手動で消すのは面倒くさいです!

リナックス先生

その通り、それが「ログの爆発」よ。
でも安心して。Linuxには、ログを自動で新しいファイルに切り替えたり、古くなったものを捨ててくれる「logrotate」という執事が最初からいるの。
この執事に正しい「指示書(設定ファイル)」を渡してあげるだけで、ディスク溢れの恐怖から解放されるわ。
全8回で、このlogrotateを完全に使いこなせるようになりましょう!

本連載では、AlmaLinux 9 をベースに、logrotateの基礎から、複雑なアプリケーションログの管理、そしてSELinuxなどのトラブルシューティングまでをステップバイステップで解説します。

🔄 logrotate完全攻略講座(全8回)目次

現在地:【第1回】サーバーの「時限爆弾」を解除せよ!ログローテーションの基礎と仕組み完全図解

  • 【第2回】設定ファイルの魔術書!ローテーション周期・サイズ・保存期間の完全制御
  • 【第3回】「ログが消えた!?」を防ぐ。copytruncateとcreateの決定的な違いとiノードの秘密
  • 【第4回】ディスク容量を極限まで節約!圧縮設定と日付付与のテクニック
  • 【第5回】再起動を自動化せよ!postrotateスクリプトによるプロセス制御
  • 【第6回】権限トラブルを回避する!ユーザー指定とACL、出力先ディレクトリの管理
  • 【第7回】動かない時の処方箋。デバッグモード活用とSELinux/ステータスファイルの罠
  • 【第8回】最強のバックアップ構築。S3への自動転送と一元管理への応用

第1章:ログローテーションとは何か?

そもそも「ログローテート(Log Rotation)」とは、具体的に何をしてくれるのでしょうか。
一言で言えば、「肥大化するログファイルを分割して整理整頓する機能」です。

ローテーションのサイクル

例えば、Apacheのアクセスログ access.log を毎日ローテーションする場合、以下のような動きをします。

  1. 1日目: access.log にログが書き込まれる。
  2. 2日目の夜中:
    • access.log の名前を access.log.1 に変更(リネーム)して退避。
    • 空っぽの新しい access.log を作成。
  3. 3日目の夜中:
    • access.log.1access.log.2 にリネーム。
    • access.logaccess.log.1 にリネーム。
    • また新しい access.log を作成。
  4. 30日後: 設定した保存期間(例:30日)を過ぎた access.log.31自動的に削除される。

この仕組みにより、最新のログは常に access.log にあり、過去のログも整理された状態で残り、かつディスク容量が無限に増えることを防げるのです。


第2章:logrotateは「いつ」動いているのか?

logrotateは、Webサーバーのように常に起動しているプログラム(デーモン)ではありません。
では、誰が彼を呼び出しているのでしょうか?

黒幕は「cron」または「systemd timer」

RHEL 9 / AlmaLinux 9 では、cron.daily(1日1回実行されるスクリプト群)の中に logrotate が含まれています。

ls -l /etc/cron.daily/logrotate

このスクリプトがあるおかげで、毎日決まった時間(通常は早朝3時〜4時頃)に logrotate コマンドが実行され、システム内のログが一斉にチェックされるのです。

💡 豆知識:anacronの役割
サーバーが夜間に電源オフになっていた場合でも、次に起動したタイミングで「あ、昨日の分やってない!」と気づいて実行してくれる仕組み(anacron)が組み込まれています。
ですので、「夜中に電源を切るサーバーだからログローテートされない」という心配はありません。


第3章:インストールと設定ファイルの構造

それでは、AlmaLinux 9 の環境を確認していきましょう。
通常、OSインストール時に標準で導入されています。

1. インストールの確認

rpm -q logrotate
# logrotate-3.18.0-... などのバージョンが表示されればOK

もし入っていなければインストールします。

sudo dnf install logrotate -y

2. 設定ファイルの場所

logrotateの設定は、大きく分けて2箇所にあります。

  • メイン設定ファイル: /etc/logrotate.conf
    システム全体のデフォルト設定(「何週間保存するか」など)が書かれています。
  • 個別設定ディレクトリ: /etc/logrotate.d/
    Apache(httpd)やMySQL(mariadb)など、インストールしたアプリケーションごとの設定ファイルが置かれます。

基本的には /etc/logrotate.d/ の中に新しいファイルを作って設定を追加します。
メインの logrotate.conf を直接編集することはあまりありません。

3. メイン設定の中身を見てみよう

cat /etc/logrotate.conf

主な内容は以下の通りです。

# ログを1週間ごとにローテーションする
weekly

# ログを4世代分(4週間分)残す
rotate 4

# 新しい空のログファイルを作成する
create

# ログファイル名に日付をつける(access.log-20260120)
dateext

# /etc/logrotate.d/ ディレクトリ内の設定ファイルを読み込む
include /etc/logrotate.d

この include ディレクティブがあるおかげで、個別の設定ファイルが有効になるわけです。


第4章:【実践】最初のログローテート設定を作ってみよう

理屈はこれくらいにして、実際に動かしてみましょう。
今回は練習として、/var/log/testapp/ というディレクトリにあるログを管理する設定を作ります。

1. テスト用ログの作成

ディレクトリとダミーのログファイルを作成します。

# ディレクトリ作成
sudo mkdir -p /var/log/testapp

# ダミーログ作成(適当な文字を入れる)
sudo sh -c 'echo "Log entry 1" > /var/log/testapp/app.log'

2. 設定ファイルの作成

/etc/logrotate.d/testapp というファイルを作成します。

sudo nano /etc/logrotate.d/testapp

以下の内容を記述してください。

/var/log/testapp/*.log {
    daily
    missingok
    rotate 7
    notifempty
    create 644 root root
}

設定の意味

記述 意味
/var/log/testapp/*.log 対象ファイルの指定。ワイルドカード(*)が使えます。
daily 毎日ローテーションを実行します。
missingok ログファイルが存在しなくてもエラーにしません(OK)。
rotate 7 7世代(7日分)保存します。8日前のものは削除されます。
notifempty ログの中身が空(0バイト)ならローテーションしません。
create 644 root root ローテーション後、権限644、所有者rootで新しいファイルを作ります。

第5章:ドライラン(テスト実行)で動作確認

設定ファイルを書いたら、いきなり放置してはいけません。
「文法ミスはないか?」「意図した通りに動くか?」を確認する必要があります。
logrotateには、実際には処理を行わずに「何をする予定か」だけを表示するデバッグモード(ドライラン)があります。

テストコマンドの実行

-d オプションを付けて実行します。

sudo logrotate -d /etc/logrotate.d/testapp

出力結果の読み方

大量のメッセージが出ますが、重要なのは以下の部分です。

reading config file /etc/logrotate.d/testapp

Handling 1 logs

rotating pattern: /var/log/testapp/*.log  after 1 days (7 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/testapp/app.log
  log does not need rotating (log has been already rotated)
  • reading config file: 設定ファイルが正しく読み込まれているか。
  • considering log …: 対象のログファイルが見つかっているか。

ここで error: ... と出なければ、設定ファイルは正常です。

⚠️ 注意:「回らない」と言われる理由
テスト実行時、log does not need rotating(ローテーションの必要なし)と表示されることがあります。
これは「前回ローテーションしてからまだ1日経っていない」ためです。
logrotateは、ステータスファイル(/var/lib/logrotate/logrotate.status)に最後の日時を記録しており、それに基づいて判断しています。


第6章:強制実行で動きを見る

「1日経つまで待てない!今すぐ動きを見たい!」という場合は、強制実行オプション -f (force) を使います。

sudo logrotate -f /etc/logrotate.d/testapp

これを実行すると、ステータスファイルの日付に関係なく、強制的にローテーションが行われます。

結果の確認

ls -l /var/log/testapp/

実行結果:

-rw-r--r--. 1 root root 0 1月 20 10:00 app.log
-rw-r--r--. 1 root root 12 1月 20 09:55 app.log.1

元の app.logapp.log.1 にリネームされ、新しい空の app.log(サイズ0)が作成されていれば大成功です!


まとめ:これで「ログ破産」は防げる!

お疲れ様でした!
まずは logrotate の基本的な役割と、設定から実行までの流れを体験しました。

今回の重要ポイント:

  • logrotateは、ログを分割・削除・圧縮してディスク容量を守るツール。
  • cronによって毎日自動的に実行されている。
  • 設定ファイルは /etc/logrotate.d/ に個別に作るのが基本。
  • -d でテスト、-f で強制実行ができる。

しかし、これだけではまだ不十分です。
「サイズが100MBを超えたら回したい」「3年分保存したい」「Apacheを再起動せずにログを切り替えたい」など、現場の要件はもっと複雑です。

次回、第2回は「設定ファイルの魔術書!ローテーション周期・サイズ・保存期間の完全制御」です。
size オプションや dateext など、より細かな制御を行うためのディレクティブを深掘りします。
自分好みのログ管理環境を作るための第一歩、お楽しみに!

▼ サーバー管理の基礎を固めるなら ▼

ログ管理を試す
「VPS」で自分専用環境

おすすめVPSを見る

インフラ知識を年収に
「ITエンジニア転職」

転職エージェントを見る

コメント