Apacheのログファイルをローテションさせるrotatelogs設定方法の備忘録です。
##logrotate/rotatelogsの違いについて
logrotateのApacheの設定ファイル(/etc/logrotate.d/httpd)を見てみると・・・
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
}
[service httpd reload]とあり、ローテートのタイミングでapacheの設定ファイルの再読み込みがかかります(詳細は/etc/init.d/httpdを確認すること)。実行中のリクエストの処理を中止してしまいます。
rotatelogsはログの削除設定ができないので、apcheのログファイルは膨れ上がる恐れがあります。環境に応じて、rotatelogsかlogrotateを使い分ける必要があります。今回、設定変更のreloadをさせたくない環境を構築する機会がありましたので、rotatelogsについての設定を書きます。
##環境
centOS 6.6
Apache 2.2.15
logrotate設定を削除
httpdをインストールすると自動的に/etc/logrotate.d/httpdができるので、このファイルを削除する。
$ rm /etc/logrotate.d/httpd
rotatelogsの設定
/etc/httpd/conf/httpd.confを下記のように書き換えます。
#以下をコメントアウト
#ErrorLog logs/error_log
#以下を追記
ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/error_log.%Y-%m-%d 86400 540"
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# 以下をコメントアウト
#CustomLog logs/access_log combined
# 以下を追記
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y%m%d 86400 540" combined
#
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## ローテートされているかの確認
下記のようなファイル名でaccessログとerrorログが1日周期でローテートされます。
$ ls /var/log/httpd/
access_log.2015-04-04
access_log
error_log.2015-04-04
error_log
# cronによるログ削除設定
Apacheの毎日ローテートさせたログファイルを30日分まで残し、30日超えたファイルは削除する。
ファイルの更新時間が30日経過したファイルを削除する設定にします。
### シェルスクリプトの作成
$ vi rm_rotatelogs_accesslog.sh
#シェルスクリプトがあるパスまで移動
cd /opt/backlog/httpd/logs
#更新時間が30日経過したaccess_log.を抽出して削除
find ./ -name 'access_log.*' -mtime +30 -exec rm -f {} ;
$ vi rm_rotatelogs_errorlog.sh
#シェルスクリプトがあるパスまで移動
cd /opt/backlog/httpd/logs
#更新時間が30日経過したerror_log.を抽出して削除
find ./ -name 'error_log.*' -mtime +30 -exec rm -f {} ;
### スクリプトに実行権限をあたえます。
$ chmod +x rm_rotatelogs_errorlog.sh
$ chmod +x rm_rotatelogs_accesslog.sh
### cronの設定
$ crontab -e
#毎日0時5分にシェルスクリプトを実行
5 0 * * * /var/log/httpd/rm_rotatelogs_accesslog.sh
5 0 * * * /var/log/httpd/logs/rm_rotatelogs_errorlog.sh
これで設定は終わり。
##更新から30日経過されたファイルが削除されていることの確認
###検証方法
1.一ヶ月間に更新されたファイルを作成
$ touch -t 201503041200 /var/log/httpd/access_log.2015-03-04
2.cronの時間を設定して、ファイルが削除されることを確認
$ crontab -e
#例えば以下のように設定すれば、毎時5分にローテートされる。
5 * * * * /var/log/httpd/rm_rotatelogs_accesslog.sh