今回は、RHEL(Red Hat Enterprise Linux)でのログローテーション設定方法とlogrotateコマンドの活用方法について、分かりやすく解説します。
Linuxサーバーを運用していると、日々蓄積されるログファイルの管理は避けて通れない重要な課題です。適切なログローテーションを設定しないと、ディスク容量が枯渇してシステム障害を引き起こす可能性があります。
この記事を読めば、logrotateの基本から実践的な設定方法まで、一通りの知識を身につけることができます。
ログローテーションとは?なぜ必要なのか
ログローテーションとは、ログファイルを定期的に切り替え、古いログを圧縮・削除する仕組みです。Linuxサーバーでは、システムやアプリケーションが常にログを出力し続けています。このログを放置すると、以下のような問題が発生します。
ログローテーションをしないとどうなる?
- ディスク容量が枯渇し、システムが正常に動作しなくなる
- ログファイルが巨大化し、障害調査時にファイルを開けない
- サービスがログを書き込めなくなり、予期しないエラーが発生する
特に本番環境では、ディスク容量の枯渇はサービス停止に直結する重大なインシデントです。logrotateを正しく設定することで、これらのリスクを未然に防ぐことができます。
logrotateの仕組みと設定ファイルの構成
RHELでは、logrotateがデフォルトでインストールされており、cronによって定期的に実行されます。
設定ファイルの場所
| ファイル/ディレクトリ | 役割 |
|---|---|
| /etc/logrotate.conf | メインの設定ファイル(グローバル設定) |
| /etc/logrotate.d/ | 個別アプリケーション用の設定ファイルを格納するディレクトリ |
| /var/lib/logrotate/logrotate.status | ローテーション実行状況を記録するステータスファイル |
設定ファイルの優先順位
logrotateは、まず/etc/logrotate.confを読み込み、その中でinclude /etc/logrotate.dの記述があれば、該当ディレクトリ内の設定ファイルも読み込みます。個別の設定ファイルで指定したオプションは、グローバル設定を上書きします。
logrotate.confの基本的な書き方
以下は、/etc/logrotate.confの基本的な構成例です。
# グローバル設定
weekly
rotate 4
create
dateext
compress
# 個別設定の読み込み
include /etc/logrotate.d
個別ログファイルの設定例
特定のログファイルに対して個別の設定を行う場合は、以下のように記述します。
/var/log/messages {
weekly
rotate 4
compress
delaycompress
missingok
notifempty
create 0640 root root
}
logrotateの主要オプション一覧
初心者の方が押さえておくべき主要なオプションを一覧表にまとめました。
ローテーション頻度のオプション
| オプション | 説明 |
|---|---|
| daily | 毎日ローテーションを実行する |
| weekly | 毎週ローテーションを実行する |
| monthly | 毎月ローテーションを実行する |
| yearly | 毎年ローテーションを実行する |
保存世代数・ファイル管理のオプション
| オプション | 説明 |
|---|---|
| rotate [数値] | 保存する世代数を指定(例:rotate 4 で4世代保存) |
| size [サイズ] | 指定サイズを超えたらローテーション(例:size 100M) |
| maxsize [サイズ] | 指定サイズを超えたら頻度に関係なくローテーション |
| minsize [サイズ] | 指定サイズ未満ならローテーションしない |
| maxage [日数] | 指定日数を超えた古いログを削除する |
圧縮関連のオプション
| オプション | 説明 |
|---|---|
| compress | ローテーション後のログをgzip圧縮する |
| nocompress | 圧縮しない |
| delaycompress | 1世代前のログから圧縮を開始する(最新のローテーションファイルは圧縮しない) |
| compresscmd [コマンド] | 圧縮に使用するコマンドを指定(デフォルト:gzip) |
ファイル作成・権限のオプション
| オプション | 説明 |
|---|---|
| create [権限] [ユーザー] [グループ] | ローテーション後に新しいログファイルを作成 |
| nocreate | 新しいログファイルを作成しない |
| copytruncate | ログファイルをコピー後、元ファイルを空にする(サービス再起動不要) |
エラーハンドリングのオプション
| オプション | 説明 |
|---|---|
| missingok | ログファイルが存在しなくてもエラーにしない |
| nomissingok | ログファイルが存在しない場合はエラーにする |
| notifempty | ログファイルが空の場合はローテーションしない |
| ifempty | ログファイルが空でもローテーションする |
その他の便利なオプション
| オプション | 説明 |
|---|---|
| dateext | ローテーションファイルに日付を付与(例:messages-20240115) |
| dateformat [書式] | 日付の書式を指定(例:dateformat -%Y%m%d) |
| olddir [ディレクトリ] | ローテーション後のファイルを指定ディレクトリに移動 |
| sharedscripts | 複数ログをまとめて処理する際、スクリプトを1回だけ実行 |
| postrotate/endscript | ローテーション後に実行するコマンドを記述 |
| prerotate/endscript | ローテーション前に実行するコマンドを記述 |
logrotateコマンドの使い方
基本的なコマンド構文
logrotate [オプション] 設定ファイル
よく使うコマンドオプション
| オプション | 説明 |
|---|---|
| -d, –debug | デバッグモード(実際には実行せず、動作を確認) |
| -f, –force | 強制的にローテーションを実行 |
| -v, –verbose | 詳細な実行ログを出力 |
| -s, –state [ファイル] | ステータスファイルを指定 |
デバッグモードで設定を確認する
本番環境で設定を変更する前に、必ずデバッグモードで動作確認を行いましょう。
# 設定ファイル全体をデバッグモードで確認
logrotate -dv /etc/logrotate.conf
# 特定の設定ファイルのみ確認
logrotate -dv /etc/logrotate.d/httpd
重要:デバッグモード(-d)では実際のローテーションは実行されません。 設定内容の文法チェックと、どのような動作をするかのシミュレーションが行われます。
手動でローテーションを強制実行する
# 強制実行(verbose付き)
logrotate -fv /etc/logrotate.conf
# 特定のログのみ強制実行
logrotate -fv /etc/logrotate.d/httpd
実践的な設定例
システムログ(/var/log/messages)の設定例
/var/log/messages {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 root root
dateext
dateformat -%Y%m%d
}
この設定では、毎日ローテーションを行い、14世代(2週間分)のログを保存します。delaycompressにより、直近のローテーションファイルは圧縮せず、障害発生時の調査をしやすくしています。
Apacheログの設定例
/var/log/httpd/*log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 root apache
dateext
sharedscripts
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript
}
Apacheのログはアクセス量によって急速に増大するため、dailyで毎日ローテーションし、30世代保存しています。postrotateでApacheをリロードし、新しいログファイルへの書き込みを開始させます。
Nginxログの設定例
/var/log/nginx/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 nginx adm
dateext
sharedscripts
postrotate
/bin/kill -USR1 `cat /var/run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
NginxはUSR1シグナルでログファイルを再オープンするため、postrotateでシグナルを送信しています。
本番環境での設定変更時の注意点
本番環境でlogrotateの設定を変更する際は、以下の点に十分注意してください。
1. 必ずデバッグモードで事前確認する
logrotate -dv /etc/logrotate.d/your-config
設定ファイルの文法エラーや意図しない動作がないか確認してから本番適用しましょう。
2. 設定ファイルのバックアップを取る
cp /etc/logrotate.d/httpd /etc/logrotate.d/httpd.bak.$(date +%Y%m%d)
3. ログの保存期間は慎重に決定する
ログを短期間で削除すると、障害調査時に必要なログが残っていない事態になります。セキュリティ要件や監査要件も考慮して保存期間を決定してください。
4. ディスク容量の監視を併用する
logrotateだけに頼らず、ディスク容量の監視も併せて実施しましょう。
# ディスク使用量の確認
df -h
# ログディレクトリのサイズ確認
du -sh /var/log/*
トラブルシューティング
ローテーションが実行されない場合
- ステータスファイルを確認する
cat /var/lib/logrotate/logrotate.status
最終実行日時が記録されています。
- cronが正常に動作しているか確認する
systemctl status crond
- 設定ファイルの文法エラーを確認する
logrotate -dv /etc/logrotate.conf 2>&1 | grep error
「file has already been rotated」エラー
同じ日に複数回ローテーションを試みると発生します。強制実行する場合は-fオプションを使用してください。
権限エラーが発生する場合
createオプションで指定したユーザー・グループが存在するか、また適切な権限が設定されているか確認してください。
まとめ
この記事では、RHELにおけるlogrotateの基本概念から実践的な設定方法まで解説しました。ログローテーションは地味ですが、サーバー運用において非常に重要な設定です。特にディスク容量の枯渇は、サービス停止につながる重大なインシデントを引き起こす可能性があります。
まずデバッグモードで動作確認する習慣を身につけ、本番環境での設定変更は慎重に行うようにしましょう。この記事が、皆さんのサーバー運用の一助となれば幸いです。

コメント