ログローテートについて考える

In: Ruby / Rails| technology

10 8月 2008

アプリを運用し始めると、原因のよくわからないトラブルに見舞われることが間々あります。
そんなとき、「とりあえずログで」とログを辿るのが常套手段だったりするのですけれど。
railsの場合、何も考えなかったら、延々と同じログファイルにひたすらログを出力する仕組みになっているから、ファイルが大きくなりすぎると、ファイルが開けないとかいう罠があったりします。

そういうのって、まずいっすよね。
ってことで、今回はログローテートの設定ってどうやるんだっけ? って話。


結論から言えば、実に単純。
/config/environment.rbか、/config/environment/#{RAILS_ENV}.rbのどれかの良きところに、こんなコードを書きます。

config.logger = Logger.new(config.log_path, 'daily')

この場合、日次でログを新しくしてローテートさせる、としています。

ファイルサイズでローテートしたいときは、こんな感じ。

config.logger = Logger.new(config.log_path, 10, 10.megabytes)

10MByteごとにログファイルを作り、10個のファイルでローテートさせる、という書き方です。
この辺りの書き方については、Rubyist Magazine – 標準添付ライブラリ紹介 【第 2 回】 Loggerを見ると、わかりよいでしょう。

configの内容については、railsをfreezeしていれば、/vendor/rails/railties/lib/initializer.rbで読めます。
そこを読むと、config.log_pathは、

File.join("#{RAILS_ROOT}", 'log', "#{RAILS_ENV}.log")

をデフォルトで設定しているとあります(表示しているソースは、説明の便宜上、ちょっと変えてます)。
なので、特に手を加えなければ、ログとしては、development.log.yyyymmddとか、production.log.0とか言うのがいっぱいできるということですね。

また、environment.rbに書くと、すべての環境に対して、設定をすることができて、#{RAILS_ENV.rb}に書くと、起動させたモードごとに対して、設定することができます。
その辺は、運用の方針で柔軟にいじれる配慮、という奴なのでしょうかね。

個人的には、development.rbに

config.logger = Logger.new(config.log_path, 10, 10.megabytes)

production.rbに

config.logger = Logger.new(config.log_path, 'daily')

なんて設定するのがいいのかなぁ、と思ったりします。

開発環境だったら、ファイルサイズで設定しておけば、放っておいてもあまり容量を圧迫しないでしょう(ファイルサイズの場合、指定した数以上のログファイルができたら古いのを上書きするため)。

一方、本番環境だったら、日付単位で保持しておけば、責任を持つ範囲の間の過去ログは保持、なんてことがわりと容易にできそうです(日付単位なら、ファイルはこちらが何か手を打たないと消えない)。

いまさらですけど、運用のノウハウって、意識しないと身につかない気がします。
個人で好き勝手やるだけだと本当わからないもんですね。

Via:


Comment Form

About this blog

ゆるーく、ふわーっと、興味のままに。

自分のかたわらに置いておくメモ代わり。

Photostream