Webサーバー(Apache)を運用していると、アクセスログやエラーログが肥大化し、ディスク容量を圧迫することがあります。
私の環境でも、気づけばログが3ヶ月で600MBを超えてしまっていました…。
このままではサーバーの容量不足やパフォーマンス低下を招くため、Linux標準のツール「logrotate」を使って、一定期間ごとに新しいログへ切り替える(ローテーション)設定を行いました。
今回はその設定手順と、動作確認の方法をメモしておきます。
1. logrotateの設定ファイルを編集
Apacheのログローテーション設定は、通常 /etc/logrotate.d/apache2(または httpd)に記述されています。
このファイルを編集して、保存期間やタイミングを調整します。
vi /etc/logrotate.d/apache2設定例と解説
以下は「月単位でローテーションし、120世代(10年分)保存する」設定例です。
/var/log/apache2/*log {
monthly
rotate 120
missingok
notifempty
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/apache2.pid 2>/dev/null` 2> /dev/null || true
endscript
}各パラメータの意味
- monthly: 月単位でローテーションする(週単位なら
weekly、日単位ならdaily、年単位ならyearly) - rotate 120: ログを何世代分残すか(例:monthlyで120なら120ヶ月=10年分)
- missingok: ログファイルが存在しなくてもエラーを出さずに処理を続行する
- notifempty: ログの中身が空の場合はローテーションしない
- sharedscripts: 複数ログがあっても
postrotate内のスクリプトを1回だけ実行する - postrotate 〜 endscript: ローテーション後に実行するコマンド(ここではApacheにHUPシグナルを送り、ログファイルを掴み直させています)
2. バーチャルホスト環境の場合
バーチャルホストを設定しており、ドメインごとにディレクトリを分けてログを保存している場合は、パスの指定をワイルドカードで書き換える必要があります。
例えば /var/log/apache2/ドメイン名/access.log のような構成の場合、1行目を以下のように変更します。
# 変更前
# /var/log/apache2/*log {
# 変更後:サブディレクトリ内のlogも対象にする
/var/log/apache2/*/*log {
monthly
rotate 60
missingok
notifempty
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/apache2.pid 2>/dev/null` 2> /dev/null || true
endscript
}3. 設定の適用と動作確認
設定ファイルを保存したら、以下のコマンドで設定を反映(手動実行)させることができます。
/usr/sbin/logrotate /etc/logrotate.confローテーション状況の確認
logrotateがいつ実行されたかは、ステータスファイルで確認できます。
cat /var/lib/logrotate.statusこのファイルを見ると、以下のように各ログの最終実行日が記録されています。
"/var/log/apache2/access.log" 2023-10-01
"/var/log/apache2/error.log" 2023-10-01すぐにローテーションテストを行いたい場合
「設定が正しいか今すぐ確認したい」「日付を待たずにローテーションさせたい」という場合は、ステータスファイルの日付を過去に書き換える方法もありますが、**強制実行オプション(-f)**を使うのが最も簡単で安全です。
# 強制的にローテーションを実行
logrotate -f /etc/logrotate.d/apache2このコマンドを実行後、ログディレクトリを確認して access.log-20231012 のように日付や連番がついた過去ログが生成され、新しい access.log が作られていれば設定は成功です。