Apache ログローテーション設定でディスク容量を節約!rotatelogs活用術
2025-05-27
「rotatelogs」の主な役割と機能
- 標準出力への出力
ローテーションせずに、ログを標準出力へ出力するモードもあります。これは、他のログ管理ツールと連携する場合などに利用されます。 - 柔軟なローテーション設定
ローテーションの間隔(時間単位)、ローテーションを行うファイルサイズ、ログファイルの保存期間などを細かく設定できます。 - ファイル名の制御
ローテーション後の新しいログファイルの名前には、日付や時刻などの情報を含めることができます。これにより、過去のログファイルを時系列で管理できます。 - ログファイルのローテーション
一定の時間間隔やファイルサイズに基づいて、自動的にログファイルを新しいファイルに切り替えます。これにより、単一のログファイルが肥大化しすぎるのを防ぎ、管理や解析を容易にします。
Apacheでの「rotatelogs」の設定方法
Apacheの設定ファイル内で、カスタムログ(CustomLog)やエラーログ(ErrorLog)のディレクティブで使用します。通常、ログファイルのパスの代わりに、パイプ記号 (|
) に続けて「rotatelogs」コマンドとそのオプションを指定します。
設定例
CustomLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/access_%Y%m%d_%H%M.log 86400" combined
ErrorLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/error_%Y%m%d.log 604800"
設定例の説明
-
ErrorLog の例
|/usr/local/apache2/bin/rotatelogs /var/log/apache2/error_%Y%m%d.log 604800
/var/log/apache2/error_%Y%m%d.log
はエラーログのローテーション後のファイル名フォーマットです(例:error_20250525.log
)。604800
はローテーションの間隔を秒単位で指定しています(この例では 7日間 = 604800秒)。つまり、毎週新しいエラーログファイルに切り替わります。
-
|/usr/local/apache2/bin/rotatelogs /var/log/apache2/access_%Y%m%d_%H%M.log 86400 combined
- パイプ (
|
) の後に続く/usr/local/apache2/bin/rotatelogs
が「rotatelogs」プログラムのパスです。 /var/log/apache2/access_%Y%m%d_%H%M.log
はローテーション後のログファイルの基本名と、日付・時刻のフォーマット指定子です(例:access_20250525_1738.log
)。86400
はローテーションの間隔を秒単位で指定しています(この例では 24時間 = 86400秒)。つまり、毎日新しいログファイルに切り替わります。combined
はログのフォーマットを指定しています。
「rotatelogs」の利点
- パフォーマンスの維持
巨大なログファイルへの書き込みは、サーバーのパフォーマンスに影響を与える可能性がありますが、ローテーションによってこれを軽減できます。 - ログ解析の容易化
小さく分割されたログファイルは、特定の期間のログを検索・解析する際に便利です。 - ディスク容量の管理
ログファイルが際限なく大きくなるのを防ぎ、ディスク容量を効率的に利用できます。
一般的なエラーとトラブルシューティング
-
-
原因
- rotatelogs のパスが間違っている
Apacheの設定ファイル (httpd.conf
や VirtualHost 設定) 内で指定しているrotatelogs
の実行ファイルのパスが正しくない可能性があります。 - パーミッションの問題
Apacheサーバーの実行ユーザー(通常はwww-data
やhttpd
など)が、rotatelogs
実行ファイルへの実行権限を持っていないか、ログファイルを保存するディレクトリへの書き込み権限を持っていない可能性があります。 - 設定ファイルの構文エラー
Apacheの設定ファイルに構文エラーがあり、設定が正しく読み込まれていない可能性があります。 - ローテーションの条件が満たされていない
設定されたローテーションの間隔(時間やサイズ)に達していないため、ローテーションがまだ行われていない可能性があります。 - パイプ処理の問題
Apacheがrotatelogs
を正しく起動できていない可能性があります。
- rotatelogs のパスが間違っている
-
トラブルシューティング
- パスの確認
設定ファイル内のrotatelogs
のパスが正しいか (which rotatelogs
コマンドなどで確認できます) を確認してください。 - パーミッションの確認
ls -l
コマンドなどでrotatelogs
の実行権限とログディレクトリの書き込み権限を確認し、必要であればchmod
やchown
コマンドで修正してください。 - 設定ファイルのテスト
apachectl configtest
コマンドなどでApacheの設定ファイルにエラーがないか確認してください。 - ローテーション設定の確認
設定したローテーションの間隔やサイズが意図通りであるか確認してください。短い間隔でテストしてみるのも有効です。 - Apacheのエラーログの確認
Apacheのエラーログ (ErrorLog
で指定されたファイル) に、rotatelogs
の実行に関するエラーメッセージが出力されていないか確認してください。
- パスの確認
-
-
ログファイル名が意図した形式にならない
-
原因
- 日付・時刻のフォーマット指定子の誤り
rotatelogs
に指定しているファイル名フォーマットの%Y
,%m
,%d
,%H
,%M
,%S
などの指定子が間違っているか、意図しない形式になっている可能性があります。 - 設定ファイルの再読み込み忘れ
設定ファイルを変更した後、Apacheを再起動または再読み込み (apachectl graceful
) しないと、変更が反映されないことがあります。
- 日付・時刻のフォーマット指定子の誤り
-
トラブルシューティング
- フォーマット指定子の確認
rotatelogs
のマニュアルやドキュメントで、正しいフォーマット指定子を確認してください。 - Apacheの再起動/再読み込み
設定変更後に必ず Apache を再起動または再読み込みしてください。
- フォーマット指定子の確認
-
-
古いログファイルが削除されない
-
原因
- 保存期間の設定がない
rotatelogs
にログファイルの保存期間を指定するオプション (-a
または-l
と組み合わせて-n
) を使用していないため、古いログファイルがそのまま残り続けている可能性があります。 - 保存期間の設定が正しくない
保存期間の設定が意図した日数やファイル数になっていない可能性があります。
- 保存期間の設定がない
-
トラブルシューティング
- 保存期間オプションの確認
rotatelogs
のマニュアルで、保存期間に関するオプション (-a
,-l
,-n
) の使い方を確認し、適切に設定してください。 - 設定値の確認
設定した保存期間の値が意図通りであるか確認してください。
- 保存期間オプションの確認
-
-
Apacheの起動に失敗する
-
原因
- rotatelogs の実行に失敗する設定
設定ファイル内でrotatelogs
の呼び出し方が間違っているか、rotatelogs
が何らかの理由で異常終了する場合、Apacheの起動に失敗することがあります。
- rotatelogs の実行に失敗する設定
-
トラブルシューティング
- 設定ファイルの確認
CustomLog
やErrorLog
のディレクティブでrotatelogs
の記述が正しいか確認してください。 - rotatelogs の単体実行テスト
問題のありそうなrotatelogs
のコマンドをターミナル上で直接実行してみて、エラーが発生しないか確認してください。 - Apacheのエラーログの確認
Apacheの起動時のエラーメッセージを確認してください。
- 設定ファイルの確認
-
-
ログが全く記録されない
-
原因
- rotatelogs の設定ミス
rotatelogs
の出力先が正しく設定されていない可能性があります。 - パーミッションの問題
Apacheサーバーの実行ユーザーが、ログファイルを保存するディレクトリへの書き込み権限を持っていない可能性があります。
- rotatelogs の設定ミス
-
トラブルシューティング
- 出力先パスの確認
rotatelogs
に指定しているログファイルのパスが正しいか確認してください。 - パーミッションの確認
ログディレクトリの書き込み権限を確認し、必要であれば修正してください。
- 出力先パスの確認
-
トラブルシューティングのヒント
- 簡単な設定でテストする
まずは短いローテーション間隔でシンプルな設定を試し、正常に動作することを確認してから、より複雑な設定に進むと良いでしょう。 - rotatelogs のマニュアルやドキュメントを参照する
man rotatelogs
コマンドなどで、rotatelogs
のオプションや使い方を詳しく調べることができます。 - 設定変更後は必ず Apache を再起動または再読み込みする
これを怠ると、設定が反映されず期待通りの動作になりません。 - Apacheのエラーログを常に確認する
rotatelogs
だけでなく、Apache全体の動作に関するエラーメッセージは、問題解決の重要な手がかりとなります。
基本的なローテーション設定 (時間ベース)
# 毎日午前0時にローテーションし、ログファイル名に日付を含める
CustomLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/access_%Y-%m-%d.log 86400" combined
# エラーログを毎日ローテーションし、古いログを7日分保持する
ErrorLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/error_%Y-%m-%d.log 86400 -l -n 7"
- 解説
CustomLog
とErrorLog
ディレクティブ内で、ログファイルのパスの代わりにパイプ (|
) で始まり、rotatelogs
コマンドが記述されています。/usr/local/apache2/bin/rotatelogs
はrotatelogs
の実行ファイルのパスです。環境によって異なる場合があります。/var/log/apache2/access_%Y-%m-%d.log
や/var/log/apache2/error_%Y-%m-%d.log
はローテーション後のログファイルの基本名と、日付のフォーマット指定子です (%Y
: 年 (4桁),%m
: 月 (2桁),%d
: 日 (2桁))。86400
はローテーションの間隔を秒単位で指定しています (24時間 = 86400秒)。-l
オプションは、ローテーション時にシンボリックリンクを作成し、常に最新のログファイルを指すようにします。-n 7
オプションは、最新の7世代のログファイルを保持し、それより古いものは削除します。
時間と分単位でのローテーション
# 1時間ごとにローテーションし、ログファイル名に時間と分を含める
CustomLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/access_%Y%m%d_%H%M.log 3600" combined
- 解説
- ローテーション間隔が
3600
秒 (1時間) に設定されています。 - ログファイル名には
%H
(時間 (24時間形式)) と%M
(分) が含まれます。
- ローテーション間隔が
ファイルサイズに基づいたローテーション
# ログファイルサイズが 10MB を超えたらローテーションする
CustomLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/access.log 10M" combined
- 解説
- ローテーション間隔の代わりに、ファイルサイズ
10M
(10メガバイト) が指定されています。ログファイルのサイズがこの値を超えるとローテーションが行われます。
- ローテーション間隔の代わりに、ファイルサイズ
ローテーションとファイル世代管理の組み合わせ
# 毎日ローテーションし、最新の5世代のログファイルを保持する (シンボリックリンクなし)
CustomLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/access_%Y-%m-%d.log 86400 -n 5" combined
- 解説
-l
オプションがないため、最新のログファイルへのシンボリックリンクは作成されません。
標準出力への出力 (ローテーションしない場合)
# ログをローテーションせずに標準出力へ出力 (通常は他のログ管理ツールと連携する場合に使用)
CustomLog "|/usr/local/apache2/bin/rotatelogs - -" combined
ErrorLog "|/usr/local/apache2/bin/rotatelogs - -"
- 解説
- 出力ファイル名の代わりにハイフン2つ (
- -
) を指定すると、rotatelogs
はログをローテーションせずに標準出力へ出力します。
- 出力ファイル名の代わりにハイフン2つ (
- Apache の設定ファイルを変更した後は、必ず Apache を再起動または再読み込み (
apachectl graceful
) して変更を適用してください。 rotatelogs
のオプションは、Apache のバージョンやrotatelogs
自体のバージョンによって利用できるものが異なる場合があります。詳細はman rotatelogs
コマンドで確認してください。- 上記のパス (
/usr/local/apache2/bin/rotatelogs
,/var/log/apache2/
) はあくまで例であり、実際の環境に合わせて変更する必要があります。
「rotatelogs」はApacheの設定内で直接利用できる便利な外部プログラムですが、より柔軟なログ処理や特定の要件に合わせてログローテーションをカスタマイズしたい場合には、他の方法を検討することができます。
-
Apacheの組み込みログローテーション機能 (mod_log_rotate)
- Apache 2.4.51 以降では、
mod_log_rotate
というモジュールが導入され、設定ファイル内で直接ログローテーションの制御が可能になりました。 - 利点
外部プログラムに依存せず、Apacheの設定だけで完結します。より統合された動作が期待できます。 - 設定例
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined RotateLogs "/var/log/apache2/access_%Y-%m-%d_%H_%M_%S.log" 86400
RotateLogs
ディレクティブで、ローテーション後のファイル名とローテーション間隔(秒単位)を指定します。- サイズベースのローテーションや、ログファイルの世代管理などのオプションも利用可能です。
- 注意点
Apacheのバージョンが比較的新しい必要があります。
- Apache 2.4.51 以降では、
-
ログローテーションツールとの連携
logrotate
のような、システムレベルで動作するログローテーションツールと連携する方法です。- 利点
Apacheだけでなく、他のアプリケーションのログも一元的に管理できます。より高度なローテーション設定(サイズ、時間、圧縮、スクリプト実行など)が可能です。 - 設定方法
- Apacheの設定では、ログファイルをローテーションせずに、通常通りファイルに出力するように設定します。
logrotate
の設定ファイル (/etc/logrotate.conf
や/etc/logrotate.d/apache2
など) で、Apacheのログファイルのローテーションルールを定義します。- logrotate の設定例
/var/log/apache2/*.log { daily rotate 7 compress delaycompress missingok notifempty create 640 www-data adm sharedscripts postrotate apachectl graceful endscript }
- 解説
/var/log/apache2/*.log
: ローテーション対象のログファイル。daily
: 毎日ローテーション。rotate 7
: 7世代のログファイルを保持。compress
: ローテーションしたログファイルをgzip圧縮。delaycompress
: 最新のログファイルは圧縮せず、次のローテーション時に圧縮。missingok
: ログファイルが存在しなくてもエラーを出さない。notifempty
: ログファイルが空でなければローテーションを実行。create 640 www-data adm
: ローテーション後に新しいログファイルを作成し、所有者とグループ、パーミッションを設定。sharedscripts
とpostrotate ... endscript
: ローテーション後に実行するスクリプト。ここでは Apache を graceful restart しています。
- 注意点
logrotate
がシステムにインストールされている必要があります。
-
カスタムスクリプトによるログ処理
- より高度なカスタマイズが必要な場合は、Perl、Python、Shellスクリプトなどのプログラミング言語で独自のログローテーション処理を実装する方法があります。
- 利点
完全に独自のロジックでログ処理を制御できます。例えば、ログの内容に基づいて特別な処理を行ったり、特定の条件でのみローテーションを実行したりできます。 - 実装例 (Shell スクリプトの簡単な例)
#!/bin/bash LOG_DIR="/var/log/apache2" LOG_FILE="access.log" DATE=$(date +%Y%m%d-%H%M%S) MAX_SIZE="10M" LOG_PATH="$LOG_DIR/$LOG_FILE" ARCHIVE_PATH="$LOG_DIR/${LOG_FILE}.${DATE}.gz" if [ -f "$LOG_PATH" ] && [ $(du -b "$LOG_PATH" | awk '{print $1}') -gt $((MAX_SIZE * 1024 * 1024)) ]; then mv "$LOG_PATH" "$LOG_DIR/${LOG_FILE}.${DATE}" gzip "$LOG_DIR/${LOG_FILE}.${DATE}" & touch "$LOG_PATH" chown apache:apache "$LOG_PATH" # Apacheの実行ユーザーとグループに設定 echo "Log rotated: $ARCHIVE_PATH" >> "$LOG_DIR/logrotate.log" fi
- このスクリプトを cron などで定期的に実行することで、
access.log
が一定サイズを超えた場合にローテーションと圧縮を行います。
- このスクリプトを cron などで定期的に実行することで、
- 注意点
スクリプトの作成、テスト、保守が必要になります。Apacheの実行ユーザーの権限にも注意が必要です。
-
ログ収集・管理ツールとの連携
- ELK Stack (Elasticsearch, Logstash, Kibana) や Splunk などのログ収集・管理ツールと連携し、Apacheのログをこれらのツールに集約して管理・分析する方法です。
- 利点
大規模なログデータの集中管理、リアルタイム分析、可視化などが可能になります。ローテーションはこれらのツール側で管理することもできます。 - 設定方法
Apacheのログをファイルに出力する設定はそのままに、これらのツールがログファイルを監視・収集するように設定します。Logstash のようなツールは、ログのローテーション機能も持っている場合があります。 - 注意点
これらのツールの導入と設定には一定の知識が必要です。