LoginSignup
63

More than 5 years have passed since last update.

ログローテション(rotatelogs)とcronによるログファイルの削除

Last updated at Posted at 2015-04-05

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
63