ヽ( ・∀・)ノくまくまー(2006-07-19)経由、DrbLogger。dRubyを使ったログ取りサーバを用意して、RailsアプリからはそのサーバからLoggerオブジェクトを取得し、そのオブジェクトを経由してログを出力する。これにより複数のdispatch.*から同一ログファイルへ書き込む際の問題が解消される、んではないかと期待。
内容もシンプルなのでさくっと読めた。ただ、実際使おうとするとログファイル名やローテーションのトリガ指定、サーバのURIなどが決めうちだったり、clean_logger.rbが使われていなかったりとちょっと不安に思ったので、仕組みだけ真似をして、自分好みに書き下ろした。相変わらず適当なので、万が一使うならよく読んでからお使い下さい。
このTypoへの組み込みが目的なのと、プラグインの仕組みをまだちゃんと知らないので、Typoのソースツリーに直接ファイルを追加していく。
まず、script/logserverとlib/drb_logger.rbを置く。短いコードなので読めばわかるが、dRubyを利用しているところ以外のほとんどはLoggerオブジェクトに丸投げしている。紹介してもらったDrbLoggerはクライアント側が結構請った凝った仕様になっていたが、こちらは面倒なので何もしていない。
script/logserver#!/usr/bin/env ruby require File.dirname(__FILE__) + '/../config/boot' require 'drb/drb' require 'yaml' require 'active_support/clean_logger' class Logger include DRb::DRbUndumped end class LoggerFactory def initialize @config = YAML.load_file("#{RAILS_ROOT}/config/logger.yml") @logger = {} end def logger(rails_env) @logger[rails_env] ||= Logger.new("#{RAILS_ROOT}/log/#{rails_env}.log", @config['shift_age'], @config['shift_size']) end def server_uri @config['server_uri'] end end factory = LoggerFactory.new DRb.start_service(factory.server_uri, factory) DRb.thread.join
lib/drb_logger.rbrequire File.dirname(__FILE__) + '/../config/boot' require 'drb/drb' require 'yaml' class DrbLogger def initialize(rails_env) config = YAML.load_file("#{RAILS_ROOT}/config/logger.yml") factory = DRbObject.new_with_uri(config['server_uri']) @logger = factory.logger(rails_env) end def method_missing(name, *args, &block) @logger.__send__(name, *args, &block) end end
次に、config/environments/production.rbでDrbLoggerオブジェクトを生成している。production以外では使わないからこうしているけども、全てにおいてDrbLoggerを使うのであればconfig/environment.rbで生成しても構わない。
config/environment/production.rbの一部require "#{RAILS_ROOT}/lib/drb_logger" config.logger = DrbLogger.new(RAILS_ENV)
さらに、config/logger.ymlというファイルを用意して、そこにログ取りサーバのURIやローテーションの設定を書く。この辺はDRb.start_serviceやLogger.newに直接渡される。このファイルはscript/logserverとDrbLoggerクラスの両者から読まれる。
config/logger.ymlserver_uri: druby://127.0.0.1:9999 shift_age: 10 shift_size: 1048576
最後にscript/logserverを起動してからscript/serverを起動する。これでいいはずなんだけど、どうかな。今この記事を書いている最中もプレビュー表示のためにもりもりログが記録されているけど、今のところよさそう(いつまで続くかな)。
% ruby ./script/logserver & % ruby ./script/server -d
なんか書き忘れていないなら、これでおわり。仕事に戻ります。
2006-08-06追記: del.icio.us/gorouより。
DrbLogger の改良版。でも実際日にンビャクマンアクセス以上あるような環境だと log とるのに dRuby って重くなって無理そう。
なるほど。というか、それくらいの規模のRails製サイトでのログ取りノウハウには興味があります。
と、書いた後にモヤモヤと妄想。複数のdispatch.が同一ログファイルに書き込むこと自体に問題があるよ(、だから、dispatch.毎に別のログファイルを作ってるよ)とか、そもそもログを取らないよ(ってのはナシか)とか。でもまあ妄想書いてるだけでは弱いよなあ、なんか作って試さないとな。


コメント
コメントを書く