DrbLogger このエントリーを含むはてなブックマーク このエントリーをブックマークした人数

ヽ( ・∀・)ノくまくまー(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.rb
require 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.yml
server_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.毎に別のログファイルを作ってるよ)とか、そもそもログを取らないよ(ってのはナシか)とか。でもまあ妄想書いてるだけでは弱いよなあ、なんか作って試さないとな。

Posted by iwadon ( 2006-08-05 11:42:00 GMT ) | カテゴリ | タグ , | トラックバックなし | コメントなし

コメント

トラックバック

トラックバックリンク:
http://moonrock.jp:23000/trackbacks?article_id=45

(leave url/email »)

   前のコメント