2026年8月26日
2026年8月26日
Apacheのログをlogrotateでローテーションする方法(設定例と動作確認)
Apacheのログは放っておくと増え続け、ディスクを使い切る原因になります。多くのLinuxディストリビューションでは、Apacheのパッケージにlogrotateの設定が同梱されており、標準のログの場所なら最初からローテーションされています。自分で設定が必要になるのは、サイトごとのログを別の場所に置いた場合や、保存期間・圧縮の方法を変えたい場合です。この記事では、標準の設定の確認方法、独自の設定ファイルの書き方と各項目の意味、事前の動作確認、つまずきやすい点を説明します。
まず標準の設定を確認する
logrotateの設定は、全体の /etc/logrotate.conf と、パッケージごとの /etc/logrotate.d/ 以下のファイルに分かれています。Apacheの設定ファイルは、Ubuntuでは /etc/logrotate.d/apache2、RHEL系(AlmaLinux・Rocky Linuxなど)では /etc/logrotate.d/httpd です。
cat /etc/logrotate.d/apache2 # RHEL系は /etc/logrotate.d/httpd
先頭に書かれたパスのパターン(Ubuntuなら /var/log/apache2/*.log、RHEL系なら /var/log/httpd/*log のような形)に一致するファイルが対象です。バーチャルホストのログを同じディレクトリに置いているなら、すでにローテーションの対象に含まれています。標準の設定の中身(保存する世代数や周期)は、ディストリビューションやバージョンによって異なるため、上のコマンドで実際の内容を見てください(2026年10月現在)。
パッケージが用意した設定ファイルは、更新のときに置き換えられることがあります。保存期間などを変えたい場合は、標準のファイルを直接書き換えるより、対象を分けて独自のファイルを作るほうが管理しやすくなります。
logrotateはいつ動くのか
logrotateは常駐するプログラムではなく、1日に1回など定期的に起動されて、条件に合うログだけを回します。最近のディストリビューションではsystemdのタイマー(logrotate.timer)、以前のものではcronの /etc/cron.daily/logrotate から起動されるのが一般的です。
systemctl list-timers logrotate.timer
最後にいつ回したかは状態ファイルに記録されます。場所はUbuntuなら /var/lib/logrotate/status、RHEL系なら /var/lib/logrotate/logrotate.status が一般的です。daily と書いても、タイマーが1日1回しか動かなければ、それより細かい周期では回りません。
独自のログの場所に設定ファイルを作る
ここでは、サイトごとのログを /var/www/example.com/logs/ に置いている例で設定を作ります。
# /etc/logrotate.d/example.com-apache
/var/www/example.com/logs/*.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
dateext
create 0640 root adm
sharedscripts
postrotate
systemctl reload apache2 > /dev/null 2>&1 || true
endscript
}
RHEL系では、create のグループを root に、postrotate の中を systemctl reload httpd に変えます。各項目の意味は次のとおりです。
daily/rotate 30: 毎日回し、30世代(約30日分)を残します。古いものから削除されます。weeklyやmonthlyも使えます。missingok/notifempty: ファイルが無くてもエラーにせず、空のファイルは回しません。compress/delaycompress: 古いログをgzipで圧縮します。delaycompressは、直前に回したファイルの圧縮を次回まで遅らせる指定です。理由は次の節で説明します。dateext: 回したファイルの名前にaccess.log-20261018のように日付を付けます。付けない場合はaccess.log.1、access.log.2と番号が付きます。create: 新しい空のログファイルを、指定した権限・所有者・グループで作ります。sharedscripts: パターンに複数のファイルが一致しても、postrotateを1回だけ実行します。これが無いと、ログファイルの数だけApacheが再読み込みされます。
なぜローテーション後にreloadするのか
Apacheはログファイルを開いたまま書き込み続けます。logrotateがファイルの名前を変えても、Apacheは同じファイル(名前が変わった古いほう)に書き続けてしまいます。そこで、postrotate で再読み込み(グレースフルリスタート)を指示し、Apacheに新しいファイルを開き直させます。
グレースフルリスタートでは、処理中のリクエストを抱えた古い子プロセスがしばらく残り、名前が変わった古いファイルに書き込むことがあります。delaycompress を付けておくと、そのファイルを次回まで圧縮しないため、書き込み中のファイルを圧縮して記録が失われることを防げます。
ファイルの中身を空にして同じファイルを使い続ける copytruncate という方法もあります。再読み込みが不要になる代わりに、コピーから切り詰めまでの間に書き込まれた行が失われる可能性があります。Apacheは再読み込みで開き直せるので、通常は copytruncate を使う必要はありません。
適用前に動作を確認する
設定ファイルを作ったら、実際に回す前に、何が行われるかを確認します。-d を付けると、ファイルを変更せずに処理内容だけを表示します。
sudo logrotate -d /etc/logrotate.d/example.com-apache
対象のファイルが正しく見つかっているか、エラーが出ていないかを確かめます。問題がなければ、-f で強制的に1回回して、実際の動きを確認します。
sudo logrotate -f /etc/logrotate.d/example.com-apache
ls -l /var/www/example.com/logs/
日付付きのファイルができ、新しい空のログファイルにアクセスが記録され始めていれば成功です。ブラウザでサイトを開いてから tail で新しいファイルを見ると、Apacheが開き直したかを確かめられます。
つまずきやすい点
- 「parent directory has insecure permissions」というエラーが出る: ログのあるディレクトリが、root以外のユーザーやグループに書き込み可能になっていると、logrotateは安全のため処理を止めます。ディレクトリの権限を見直すか、設定に
su root admのように、ローテーションを行うユーザーとグループを指定します。 - 「duplicate log entry」というエラーが出る: 同じファイルが複数の設定ファイルのパターンに一致しています。標準のApacheの設定と独自の設定の両方で同じディレクトリを指定していないかを確認します。
- ローテーション後もログが古いファイルに書かれる:
postrotateの再読み込みが失敗しています。サービス名(apache2かhttpdか)が合っているか、-fで実行したときの出力を確認します。 - ディスクの空きがすぐ減る: アクセスの多いサイトでは、日次でも1つのファイルが大きくなることがあります。
maxsize 500Mのように指定すると、周期の前でも大きさが上限を超えたときに回します(判定はlogrotateが起動したときに行われます)。
Apache付属のrotatelogsという選択肢
Apacheには、パイプでログを受け取り、一定の時間や大きさで自動的にファイルを切り替える rotatelogs も付属しています。
CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/example.com-access.%Y%m%d.log 86400" combined
再読み込みが不要になる一方で、古いファイルの削除や圧縮は別に用意する必要があり、プログラムの場所も環境によって異なります(RHEL系では /usr/sbin/rotatelogs が一般的です)。サーバー全体のログ管理をlogrotateにそろえているなら、logrotateを使うほうが運用は単純です。
保存期間と個人情報
アクセスログには、訪問者のIPアドレスやアクセスしたURL、ブラウザの情報が記録されます。必要以上に長く残すと、漏えいしたときの影響が大きくなります。障害調査やセキュリティの確認に必要な期間を決めて rotate の世代数に反映し、プライバシーポリシーにログの取り扱いを記載しているなら、その内容と実際の保存期間をそろえておきます。
まとめ
- Apacheのパッケージにはlogrotateの設定が同梱されており、標準のログの場所なら最初からローテーションされています。
- ログを別の場所に置く場合は
/etc/logrotate.d/に独自の設定を作り、postrotateでApacheを再読み込みさせます。 delaycompressとsharedscriptsは、Apacheのログを回すときにほぼ必須の組み合わせです。- 設定を作ったら
logrotate -dで確認し、-fで1回実際に回して動作を確かめます。 - 保存期間は、調査に必要な期間と個人情報の扱いの両方から決めます。