131 lines
2.5 KiB
Ruby
131 lines
2.5 KiB
Ruby
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
|
|
|