Apacheのログローテートで失敗しないポイント

アクセス数が増えれば増えるほど、Apacheのaccess_logはすぐに肥大化してしまいます。

ログローテーションしていないと、ひとつのaccess_logファイルにどんどんログが書き込まれ、気付いた時には、ログの肥大化が原因でディスク容量を使い果たし、システム動作に異常を来たすこともあります。

また、肥大化したログからアクセス分析するのも一苦労だったり、分析ツールに読み込ませたりダウンロードするのも一苦労となり、管理もし辛く百害あって一利無しとはこのことです。

やり方は色々ありますが、大きく分けて3つのアプローチがあり、それぞれ知っておいても損は無いのでこの際知っておきましょう。

基本的な考えはどれも同じようなもので、日付が変わった時点で今あるログファイルをリネームして、新たにログを作り直し始めるの繰り返し。それをどういうアプローチで実装するかということ。

シェルスクリプト+cronでお手軽ローテーション

apacheの権限でシェルスクリプトを作成し、cron設定します。
access_logを作成しているユーザーを確認しておきましょう。

どっかにファイルを作って、crontabでcronを設定してもいいけど、cron.daily直下にスクリプトを作成し、勝手に毎日実行してもらいましょう。一応、AlmaLinux想定で、理論的なコードを示しますが、実際試して無いので、自分のスキルと知識を総動員してなんとかなりそうなら使ってもいいけど、後述する方法をおすすめします。あくまで知識としてね。

# vi /etc/cron.daily/simple-logrotate

#!/bin/sh
ADDDATE='date +%y%m%d'
cd /var/log/httpd
mv access_log access_log.$ADDDATE
/usr/sbin/apachectl graceful
sleep 300
gzip access_log.$ADDDATE

# chmod +x /etc/cron.daily/simple-logrotate

対象ログのパスは自身の環境に合わせて設定。ログファイル名もssl_access_logだったり、エラーログだったりするので、自分の環境に合わせて設定。複数ある場合は、cd -mv-gzipをその分足せばいい。apachectlが無ければ、「/usr/sbin/httpd reload」に変更するなど自分の環境に合わせて設定。「which apachectl」とかでコマンド見つけてね。

Apacheのconfファイルで勝手にローテーション

Apacheのrotatelogs機能を使う方法。単純にCustomLogを編集すればいいだけ。

「which rotatelogs」とかしてコマンドパスは調べておこう。

confの設定部分を下記の様に記述。あとは勝手にやってくれるはず。

CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y%m%d 86400 540" combined

「86400」は24時間ごとってことで、「540」はUTC時刻から540分=9時間ずらすということ。

順当で最強のlogrotateでローテーション

「which logrotate」でインストールを確認しておく。

インストールされていなければ、「dnf install logratate」してインストール。

ローテーションの設定ファイルを作成。

# vi /etc/logrotate.d/httpd

/var/log/httpd/*log {
su root root
daily
rotate 31
compress
missingok
noifempty
dateext
delaycompress
sharedscripts
postrotate
/usr/sbin/apachectl graceful > /dev/null 2>/dev/null || true
endscript
}

手動実行するには、

# logrotate -v /etc/logrotate.d/co-medical

オプションに「d」を付けて実行すればデバッグモードになり、実行ログが確認できるが実際は実行されない。

忘れがちのlogrotateサービス登録と有効化。

# systemctl start logrotate.timer
# systemctl enable logrotate.timer

これを実行し忘れるとローテーションが実行されないので要注意。

設定できる項目は色々あるので、検索してみると良い。基本良く使う設定は下記の通り。多少意味を知っておくことも大切。

su root root指定されたユーザーとグループでログファイルをローテーションする。デフォルトはいずれもrootになっている。
daily毎日実行
weekly毎週実行
monthly毎月実行
rotate [ローテーション回数]いくつログファイルを残すか
compressログをgzipで圧縮
nocompress圧縮しない
delaycompress前々日以前のログを圧縮(compressと併用必須)
ifemptyログファイルが空の場合でもローテーション
notifemptyログファイルが空の場合ローテーションしない
missingokログファイルが存在しない場合にエラーを出力しない
nomissingokログファイルが存在しない場合にエラーを出力
dateextローテーションしたログのsuffixに番号をつけるのではなく、日付8桁(-YYYYMMDD) をつける
sharedscriptsログファイルを複数指定した場合、それぞれpostrotate、prerotate内のコマンドを実行
postrotateendscriptとの間に書いたコマンドをローテーション後に実行
prerotateendscriptとの間に書いたコマンドをローテーション前に実行

これで、あなたもログローテーションマスター!

Add comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください