MEMORVA

Apacheのログ・ローテーション設定(access_logのlogrotate)

更新:2026-06-06

Apacheのアクセスログ(access_log)やエラーログ(error_log)は、初期設定では同じファイルに追記され続け、ファイルサイズが徐々に大きくなっていく場合がある。

ログ・ローテート(logrotate)を使うと、日別、週別、月別など一定期間ごとにファイルを分けて記録できる。 またローテーションするファイル数も指定できるため、ログファイルが増え続けることもない。

ここでは以下の環境の場合で説明する。

  • OS:Rocky Linux 9
  • リポジトリからyumでhttpd(Apache)をインストール

設定ファイルは /etc/logrotate.conf にある。 そのファイルの中身を見ると /etc/logrotate.d/ というディレクトリ内のファイルを include していることが分かる。 アプリケーションごとに個別にローテーションを指定する場合はたいていこのディレクトリ内にファイルがある。 Apacheならhttpdなどのファイルがある。 もしない場合は自分で作成しても良い。

以下 /etc/logrotate.d/httpd を編集する例で説明する。

ファイルの中身は以下のようになっている。

# Note that logs are not compressed unless "compress" is configured,
# which can be done either here or globally in /etc/logrotate.conf.
/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}

日別にファイルを保存。 残すファイル数を100。 gzipで圧縮。 これらの指定を加えると以下のようになる。

# Note that logs are not compressed unless "compress" is configured,
# which can be done either here or globally in /etc/logrotate.conf.
/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    daily
    rotate 100
    compress
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}

SSL証明書(Let's Encrypt)

上記例ではローテーション後、httpd(Apache)の設定を reload している。 この場合、reload 後まれに Let's Encrypt などSSL証明書の読み込みに失敗していることがある。 reload を restart に変更するとこの問題が解消される場合がある。

この件は、どうも Let's Encrypt の更新の設定(/etc/sysconfig/certbot)に問題があるようだ。 証明書を自動更新する設定として certbot に以下のような記述をする例がよく紹介されている。

POST_HOOK="--post-hook 'systemctl restart httpd'"

これとlogrotateがかぶり証明書の読み込みに失敗することがあるようだ。 よって POST_HOOK の箇所も reload にするか DEPLOY_HOOK の箇所に記述するといった対処法が考えられる。

ただ、logrotateの間隔がdailyやweeklyなど証明書の更新間隔より短いならcertbotにはhttpdの reload/restart は記述しないで良いかもしれない。

logrotate のコマンド一覧

期間
daily(毎日)、weekly(毎週)、monthly(毎月)がある。
rotate
指定した回数ローテーション(いくつログファイルを残すか)
rotate [ローテーション回数]
gzip圧縮
compress(圧縮する)、nocompress(圧縮しない)、delaycompress(遅延圧縮)がある。
delaycompress は単体では機能しない模様。compress も同時に指定する。
ifempty
ログファイルが空の場合でもローテーション。
notifempty
ログファイルが空の場合ローテーションしない。
missingok
ログファイルが存在しない場合にエラーを出力しない。
nomissingok
ログファイルが存在しない場合にエラーを出力。
postrotate
endscript との間に書いたコマンドをローテーション後に実行。
prerotate
endscript との間に書いたコマンドをローテーション前に実行。
size
ログファイルが指定サイズ以上の場合ローテーション。
size [ファイルサイズ]
sharedscripts
ログファイルを複数指定した場合、それぞれ postrotate、prerotate 内のコマンドを実行。
create
ローテーション後、空のログファイルを作成。
create [パーミッション] [ユーザ名] [グループ名] で権限の指定可能。
nocreate
空のログファイルを作成しない。
olddir
指定したディレクトリにローテーションしたログを保存。
olddir [ディレクトリ名]
noolddir
元と同じディレクトリにローテーションしたログを保存。

/etc/logrotate.d/ ディレクトリ以下にファイルを作れば、その他のログに関しても利用可能。 通常ログファイルは /var/log/ などにある。 yumなどを利用してインストールしたものは自動的に logrotate が設定される場合がある。 ソースをコンパイルしてインストールしたアプリケーションの場合は、/var/log/ 以外のディレクトリにログを保存する場合があるので、自分でログファイルがあるディレクトリを指定する。

関連: ログファイル - Apache HTTP サーバ