あーかいぶすハイディフィニション

ここはもう更新しとらんのじゃ

Unicorn のログローテート

ドキュメント見る限り、Unicorn_Rails Master も Unicorn Worker も、USR1 シグナルを送信すれば、ログの再オープンするようなので、原理的には簡単にローテートされるはず!

あーうまくいかねーので、シェルスクリプト書いて crontab でぶんまわすかー。
エントリ再度記述中なのでちょっと待ってね!

11/19追記

やったーできたよー\(^o^)/
logrotate の挙動をよく理解してないので、シェルスクリプトと cron の組み合わせで作ったけど、まあこれはこれで分かりやすくていいんじゃないかな?と神は言ってイルノデス!


ちなみに元になったコードは、お仕事で「Passenger で動かしてる RailsApp の production.log だけローテートしたい (httpd 側と別タイミングでローテートさせたい)」とか言われて作ったやつです。そんなもんしらんがな……(´・ω・`)

実行すると「production.log」「unicorn.log」を実行された時点から1日前の日付にリネームして、gz 圧縮します。1日前の日付は、ディストリによって実装が違うので、リリース先の CentOS 環境と、開発環境の MacOSX 両方で実行出来るように case で分けてあります。条件は uname で取得してるので「実行できない!」とかいわれたら、uname -a の一つ目の単語を case 文に突っ込んで、1日前の日付を $LOGDATE に突っ込むようにしてあげてくだしあ。

あ、もちろん、cron を実行するユーザは、それぞれコマンドへのパスは通してください。cd mv touch gzip kill が使えれば問題無いですが、宗教上の理由で gzip が利用できない!等の場合は、適時書き換えてね!(*´ω`*)

#!/bin/sh

#
# logrotater.sh
#
# 黄金の鉄の塊で出来た unicorn_rails 先生に一般貧弱人のシェルスクリプトがナメタ態度をとる事によって灰になって死ぬ
# hai!!すいまえんでした、まだログファイルをロストしたくないんです;;
#

# 環境によって変更するところ、ここから

# Rails アプリケーションのルートパス
RAILS_ROOT="/var/www/rails/"
# Rails が出力するログディレクトリへのパス
LOG_DIR=$RAILS_ROOT"logs/"
# ディレクトリ内のローテート対象ファイル名、半角スペース区切り
LOG_NAME=( production.log unicorn.log )

# 環境によって変更するところ、ここまで

# ローテートする関数
rotater(){
  cd $LOG_DIR
  COUNTER=0
    while [ $COUNTER -lt ${#LOG_NAME[@]} ]
    do
      mv ${LOG_NAME[$COUNTER]} ${LOG_NAME[$COUNTER]}"."$LOGDATE
      touch ${LOG_NAME[$COUNTER]}
      gzip ${LOG_NAME[$COUNTER]}"."$LOGDATE
      let COUNTER=COUNTER+1
    done
    # Unicorn_rails master へ USR1 シグナルを送信して、ログのファイルぽいんとぅあを開放
    UNICORN_PROC_NUM=`pgrep -f 'unicorn_rails master'`
    kill -USR1 $UNICORN_PROC_NUM
}

# 実行
OS=`uname -a | awk '{ print $1 }'`
case "$OS" in
  # Linux ( RHEL | RHEL clone)
  Linux )
    LOGDATE=`date --date '1 days ago' +%Y%m%d`
    rotater
    ;;
  # MacOSX ( FreeBSD に同じ)
  Darwin )
    LOGDATE=`date -v-1d +%Y%m%d`
    rotater
    ;;
  # 上記に当てはまらない場合
  * )
    unset LOGDATE
    echo "この環境( "$OS" )では目的の日付を取得できないため、スクリプトは実行されませんでした。"
    ;;
esac