class Logging::Appenders::Logstash

This class provides an Appender that can write to remote syslog.

Constants

ID_REG_EXP

Attributes

logstash_device[R]

to have a good entry point for testing

Public Class Methods

new(name, opts = {}) click to toggle source

call:

Logstash.new( name, opts = {} )

Create an appender that will log messages to logstash. The options that can be used to configure the appender are as follows:

it accepts all options of logstash logger: github.com/dwbutler/logstash-logger

Calls superclass method
# File lib/logging/appenders/logstash.rb, line 28
def initialize(name, opts = {})
  @host=opts.delete(:host) || Socket.gethostname
  @logstash_device=LogStashLogger::Device.new(opts)
  super
end
num_to_level(level_num) click to toggle source
# File lib/logging/appenders/logstash.rb, line 13
def self.num_to_level(level_num)
  @level_nums ||= Loggin::LEVELS..inject({}) do |hash, kv|
    hash[kv[1]] = kv[0]; hash
  end
  @level_nums[level_num]
end

Private Instance Methods

data2logstash_event(logging_event) click to toggle source
# File lib/logging/appenders/logstash.rb, line 54
      def data2logstash_event(logging_event)
        stash_event=if logging_event.data.kind_of?(Hash)
                      LogStash::Event.new(logging_event.data.dup)
                    else
                      LogStash::Event.new("message" => msg2str(logging_event.data))
                    end

        stash_event['@severity'] ||= ::Logging::LNAMES[logging_event.level]
        stash_event['@host'] ||= @host
        stash_event['@log_name'] ||= @name

        #context values don't override given values
        Logging.mdc.context.each do |key, value|
          stash_event[key] ||= value
        end

        Logging.ndc.context.each do |ctx|
          if ctx.respond_to?(:each)
            ctx.each do |key, value|
              stash_event[key] ||= value
            end
          else
            stash_event[ctx] ||= true #
          end
        end

# In case Time#to_json has been overridden
        if stash_event.timestamp.is_a?(Time)
          stash_event.timestamp = stash_event.timestamp.iso8601(3)
        end
        

        stash_event.to_hash.each do |key,value|
          if key =~ ID_REG_EXP
            stash_event[key]=value.to_s
          end
        end
        
        stash_event
      end
msg2str(msg) click to toggle source
# File lib/logging/appenders/logstash.rb, line 95
def msg2str(msg)
  case msg
    when ::String
      msg
    when ::Exception
      "#{ msg.message } (#{ msg.class })\n" <<
          (msg.backtrace || []).join("\n")
    else
      msg.inspect
  end
end
write(event) click to toggle source

call:

write( event )

The trick is, that logging accepts all kind of objects to be logged. They are in the event.data and are raw (not turned into strings).

# File lib/logging/appenders/logstash.rb, line 46
def write(event)
  ls_event= data2logstash_event(event)

  logstash_device.write(ls_event.to_json+"\n")
  logstash_device.flush
  self
end