「ログ」は、放っておくと「ゴミ」になる。
こんにちは!「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日目:
access.logにログが書き込まれる。 - 2日目の夜中:
access.logの名前をaccess.log.1に変更(リネーム)して退避。- 空っぽの新しい
access.logを作成。
- 3日目の夜中:
access.log.1をaccess.log.2にリネーム。access.logをaccess.log.1にリネーム。- また新しい
access.logを作成。
- 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.log が app.log.1 にリネームされ、新しい空の app.log(サイズ0)が作成されていれば大成功です!
まとめ:これで「ログ破産」は防げる!
お疲れ様でした!
まずは logrotate の基本的な役割と、設定から実行までの流れを体験しました。
今回の重要ポイント:
- logrotateは、ログを分割・削除・圧縮してディスク容量を守るツール。
- cronによって毎日自動的に実行されている。
- 設定ファイルは
/etc/logrotate.d/に個別に作るのが基本。 -dでテスト、-fで強制実行ができる。
しかし、これだけではまだ不十分です。
「サイズが100MBを超えたら回したい」「3年分保存したい」「Apacheを再起動せずにログを切り替えたい」など、現場の要件はもっと複雑です。
次回、第2回は「設定ファイルの魔術書!ローテーション周期・サイズ・保存期間の完全制御」です。size オプションや dateext など、より細かな制御を行うためのディレクティブを深掘りします。
自分好みのログ管理環境を作るための第一歩、お楽しみに!
▼ サーバー管理の基礎を固めるなら ▼
ログ管理を試す
「VPS」で自分専用環境
インフラ知識を年収に
「ITエンジニア転職」


コメント