技術・開発

【Apache】ログ肥大化を防ぐ!logrotateの設定方法と動作確認手順

2010年9月2日

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 が作られていれば設定は成功です。

-技術・開発
-, , , , ,