スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PadrinoでMongoDBに保存するLogger

最近ログ関連の話題が連続してますが、今回もです。
Padrinoのページを見るとORMと連携してログが使えると書いてあります。
これを見た時、今まで見たいに自前で実装しなくていいんだろうな、と思っていたのですが甘かった。
まず、ドキュメントがまったくありません。
しょうがないのでソースを見てみましたが、ログを出すだけのわりに妙に長いんです。
で、どうやらインスタンス初期化時に:streamというパラメーターにログを書くためのオブジェクトを渡せばよいことがわかりました。
必要なのはsyncというset可能なメンバとmsgを受け付けるwriteというメソッドだけが必要なようです。
syncは何やってんのか意味わからないので、「attr_accessor :sync」だけして放置。
あと、writeメソッドが意外とやっかいでした。
そもそも、msgしか引数が無いため時間もログレベルもメッセージもごちゃまぜです。
仕方が無いので、フォーマットを適当に調整してmsgを受け取ってから分解することにしました。
だけど、そもそもPadrinoのログがコンソールに出力することが前提になっているのか、いちいちエスケープシーケンスが挿入されています。
こいつもMongoDBに入れるときに邪魔なので排除しました。
以下のようなソースになりました。修正するのはPadirinoが自動生成したconfig/boot.rbです。
# Defines our constants
PADRINO_ENV = ENV['PADRINO_ENV'] ||= ENV['RACK_ENV'] ||= 'development' unless defined?(PADRINO_ENV)
PADRINO_ROOT = File.expand_path('../..', __FILE__) unless defined?(PADRINO_ROOT)

# Load our dependencies
require 'rubygems' unless defined?(Gem)
require 'bundler/setup'
require 'mongo'
Bundler.require(:default, PADRINO_ENV)

##
# Enable devel logging
#
#Padrino::Logger::Config[:development][:log_level] = :devel
#Padrino::Logger::Config[:development][:log_static] = true
#

##
# Add your before load hooks here
#
Padrino.before_load do
end

##
# Add your after load hooks here
#
Padrino.after_load do
end

class MongoLogger
attr_accessor :sync

def initialize()
@coll = Mongo::Connection.new('localhost', 27017)['test']['syslog']
end

def write(msg)
msg = msg.gsub(/\u001b\[\d+m/, "").strip
index = msg.index(",")
level = msg[0..index-1]
msg = msg[index+1..msg.length]
level = Padrino::Logger::Levels[level.downcase.to_sym]
@coll.insert({i: Time.now, l: level, m: msg.strip}, {safe: true})
end
end

Padrino::Logger::Config[:development][:stream] = MongoLogger.new
Padrino::Logger::Config[:development][:format_datetime] = ""
Padrino::Logger::Config[:development][:format_message] = "%s,%s%s"
Padrino.load!
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。