Webサーバでapacheなどが出力するAPIログを、定期的に収集する事はよくありますよね。
シェルを用意してcronで回すのも面倒だったので、logrotateのみを使って収集を行ってみました。
logrotate
logrotateは放っておけば際限なく肥大してしまう各種ログファイルに対して、
世代ローテーションを行いN世代以前の破棄や、転送など、様々な処理が行える。
世代管理やサイズ制限などの機構を自前で持たないプログラムからのログを管理するのに使用する。
環境
OS |
---|
CentOS release 6.5 (Final) |
要件
- 昨日のAPIのログをストレージサーバ(xxx.xxx.xxx.xxx)に転送する
- ログは圧縮する
- ログのローテートは一日ごと
- ログのsuffixに日付を付ける
- 7日以前のログはWEBサーバから削除する(容量対策)
対象ログ |
---|
/var/log/httpd/api_access_log |
/var/log/httpd/api_error_log |
API用のlogrotate設定ファイルを作成する
logrotate設定ファイル |
---|
/etc/logrotate.d/httpd-api |
apacheをインストールすると自動でhttpdの設定ファイルが作成されます。
/etc/logrotate.d/httpd
こちらにも設定が書いてあるので処理が被らないようにしましょう。
apacheのデフォルト設定が不要であればこちらを直接編集しても良いと思います。
/etc/logrotate.d/httpd-api
/var/log/httpd/api_access_log {
daily
rotate 7
dateext
create 0644 apache apache
olddir /var/backup/log/api
missingok
sharedscripts
compress
lastaction
/bin/mv /var/backup/log/api/api_access_log-`date '+%Y%m%d'`.gz /var/backup/log/api/api_access_log-`date '+%Y%m%d' -d '1days ago'`.gz
endscript
}
/var/log/httpd/api_error_log {
daily
rotate 7
dateext
create 0644 apache apache
olddir /var/backup/log/api
missingok
sharedscripts
compress
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
lastaction
/bin/mv /var/backup/log/api/api_error_log-`date '+%Y%m%d'`.gz /var/backup/log/api/api_error_log-`date '+%Y%m%d' -d '1days ago'`.gz
/usr/bin/rsync -az -e ssh /var/backup/log/api/ user@xxx.xxx.xxx.xxx:/var/backup/log/api/
endscript
}
- 昨日のログをgzip化してolddirに移動
- ログファイル名の日付が今日になっているので昨日に変更
- olddirをrsyncでストレージサーバに転送
- access_logとerror_logのolddirは同じなのでrsyncは一回のみ
各パラメータの詳細はこのサイトが参考になります。
ログローテーション(logrotate)を使ってみる ( httpd(apache)の設定例 )
http://server-setting.info/centos/loglotation.html
エラーチェック
下記コマンドを叩いてエラーが出ない事を確認します。
# logrotate -dv /etc/logrotate.d/httpd