スポンサーサイト

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

Padrinoでlog4rを使う

以前PadrinoのロガーでMongoDBを使う記事を書きましたが、MongoDBだけで無くエラーレベルによってはメールで出したかったので、log4rを使ってみました。
まず、log4rの設定から
lib/log4r.yaml
log4r_config:

pre_config:
global: "DEBUG"

loggers:
- name: "development"
type: "Log4r::Logger"
level: "DEBUG"
trace: "true"
outputters:
- "Stdout"
- "Mongo"
- "Mail"
- name: "production"
type: "Log4r::Logger"
level: "DEBUG"
trace: "true"
outputters:
- "Mongo"
- "Mail"

outputters:
- name: "Stdout"
type: "StdoutOutputter"
formatter:
name: "P1"
type: "PatternFormatter"
pattern: "%d [%l] %c(%t) - %m"
date_pattern: "%H:%M:%S"
- name: "Mail"
type: "MailOutputter"
level: "WARN"
formatter:
name: "P2"
type: "PatternFormatter"
pattern: "%d [%l] %c(%t) - %m"
date_pattern: "%H:%M:%S"
- name: "Mongo"
type: "MongoOutputter"
safe: "false"
formatter:
name: "P3"
type: "PatternFormatter"
pattern: "%d [%l] %c(%t) - %m"
date_pattern: "%H:%M:%S"

ここで定義しているMongoOutputterとMailOutputterは自作です。Mailに関してはEMailOutputterというlog4rで提供されているものも有るのですが、日本語が通らないので使いません。
lib/mongo_outputter.rb
#coding: utf-8
require 'log4r/outputter/outputter'
require 'mongo'

class MongoOutputter < Log4r::Outputter
attr_accessor :collection

def initialize(_name, hash={})
super(_name, hash)
@safe = hash['safe'] ? hash['safe'] : false
if hash['host'] || hash['port'] || hash['db'] || hash['collection']
conn = Mongo::Connection.new(
hash['host'] ? hash['host'] : 'localhost',
hash['port'] ? hash['port'].to_i : 27017)
db = conn[hash['db'] ? hash['db'] : 'test']
@collection = db[hash['collection'] ? hash['collection'] : 'syslog']
end
end

def canonical_log(logevent)
@collection.insert({l: logevent.level, i: Time.now, d: logevent.data}, {safe: @safe})
end
end

lib/mail_outputter.rb
#coding: utf-8
require 'log4r/outputter/outputter'

class MailOutputter < Log4r::Outputter
attr_accessor :mail
def initialize(_name, hash={})
super(_name, hash)
end

def write(data)
@mail.send_mail({content: data})
end
end

次に設定です。MongoDBのコレクションとメールはここで作成します。メールは以前書いた独自で作ったクラスです。libに置いておきます。
app/app.rb
#coding: UTF-8
require 'mongo'
require 'log4r'
require 'log4r/yamlconfigurator'
class Api < Padrino::Application
register SassInitializer
register Padrino::Rendering
register Padrino::Mailer
register Padrino::Helpers

configure do
conn = Mongo::Connection.new('localhost', 27017)
Log4r::YamlConfigurator.load_yaml_file(File.dirname(__FILE__) + '/../lib/log4r.yaml')
logger = Log4r::Logger["development"]
logger.outputters.each do |it|
if it.name == "Mongo"
it.collection = conn['test']['syslog']
elsif it.name == "Mail"
it.mail = MyMail.new(
from: "noreply@example.com",
subject: "error",
to: "my@example.com"
)
end
end
set :my_logger, logger
end

def my_logger
settings.my_logger
end
end


利用の仕方は
my_logger.info('abc')
のようになります。
以前はPadrinoのロガーの仕組みにのっかりましたが、その仕様に会わせるのがめんどうくさかったので、独自にのmy_loggerという形にしました。
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。