ゲーム業界エンジニアの独り言

クライアント、サーバ、インフラなどなど興味あることなんでも紹介

APIログをlogrotateのみで収集する

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のデフォルト設定が不要であればこちらを直接編集しても良いと思います。

/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

新しいLinuxの教科書

新しいLinuxの教科書