bestmike007/log4rails

View on GitHub
lib/log4r/outputter/bufferedsyslogoutputter.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'log4r/outputter/syslogoutputter'

module Log4r
  class BufferedSyslogOutputter < SyslogOutputter

    def initialize(*args)
      super
      @buff = {}
    end

    def flush
      synch do
        begin
          @buff.each do |pri, message|
            Syslog.open(@ident, @logopt, @facility) do |s|
              s.log(pri, '%s', message.join("\t"))
            end
          end
        ensure
          @buff.clear
        end
      end
    end

    private

    def canonical_log(logevent)
      begin
        pri = SYSLOG_LEVELS_MAP[@levels_map[LNAMES[logevent.level]]]
      rescue
        pri = LOG_INFO
      end

      return if logevent.data.empty?

      msg = format_event(logevent)
      synch { @buff.has_key?(pri) ? @buff[pri].push(msg) : @buff[pri] = [msg] }
    end
    
    def format_event(logevent)
      o = format(logevent)
      if o.is_a? Exception
        "#{o.class} at (#{o.backtrace[0]}): #{o.message}"
      elsif o.respond_to?(:to_str)
        o.to_str
      else
        o.inspect
      end
    end
  end
end