Apacheのログ・ローテーション設定(access_logのlogrotate)
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/ 以外のディレクトリにログを保存する場合があるので、自分でログファイルがあるディレクトリを指定する。