lib/yell/event.rb
require 'time'
require 'socket'
module Yell #:nodoc:
# Yell::Event.new( :info, 'Hello World', { :scope => 'Application' } )
# #=> Hello World scope: Application
class Event
# regex to fetch caller attributes
CallerRegexp = /^(.+?):(\d+)(?::in `(.+)')?/
# jruby and rubinius seem to have a different caller
CallerIndex = defined?(RUBY_ENGINE) && ["rbx", "jruby"].include?(RUBY_ENGINE) ? 1 : 2
class Options
include Comparable
attr_reader :severity
attr_reader :caller_offset
def initialize( severity, caller_offset )
@severity = severity
@caller_offset = caller_offset
end
def <=>( other )
@severity <=> other
end
alias :to_i :severity
alias :to_int :severity
end
# Prefetch those values (no need to do that on every new instance)
@@hostname = Socket.gethostname rescue nil
@@progname = $0
# Accessor to the log level
attr_reader :level
# Accessor to the log message
attr_reader :messages
# Accessor to the time the log event occured
attr_reader :time
# Accessor to the logger's name
attr_reader :name
def initialize( logger, options, *messages)
@time = Time.now
@name = logger.name
extract!(options)
@messages = messages
@caller = logger.trace.at?(level) ? caller[caller_index].to_s : ''
@file = nil
@line = nil
@method = nil
@pid = nil
end
# Accessor to the hostname
def hostname
@@hostname
end
# Accessor to the progname
def progname
@@progname
end
# Accessor to the PID
def pid
Process.pid
end
# Accessor to the thread's id
def thread_id
Thread.current.object_id
end
# Accessor to filename the log event occured
def file
@file || (backtrace!; @file)
end
# Accessor to the line the log event occured
def line
@line || (backtrace!; @line)
end
# Accessor to the method the log event occured
def method
@method || (backtrace!; @method)
end
private
def extract!( options )
if options.is_a?(Yell::Event::Options)
@level = options.severity
@caller_offset = options.caller_offset
else
@level = options
@caller_offset = 0
end
end
def caller_index
CallerIndex + @caller_offset
end
def backtrace!
if m = CallerRegexp.match(@caller)
@file, @line, @method = m[1..-1]
else
@file, @line, @method = ['', '', '']
end
end
end
end