アクセス数が増えれば増えるほど、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内のコマンドを実行 |
postrotate | endscriptとの間に書いたコマンドをローテーション後に実行 |
prerotate | endscriptとの間に書いたコマンドをローテーション前に実行 |
これで、あなたもログローテーションマスター!
Add comment