class Celluloid::IncidentLogger

A logger that holds all messages in circular buffers, then flushes the buffers when an event occurs at a configurable severity threshold.

Unlike ruby's Logger, this class only supports a single progname.

Attributes

buffers[RW]
level[RW]

The logging level. Messages below this severity will not be logged at all.

progname[RW]

The progname (facility) for this instance.

sizelimit[RW]

The buffer size limit. Each log level will retain this number of messages at maximum.

threshold[RW]

The incident threshold. Messages at or above this severity will generate an incident and be published to incident reporters.

Public Class Methods

new(progname = nil, options = {}) click to toggle source

Create a new IncidentLogger.

# File lib/celluloid/logging/incident_logger.rb, line 45
def initialize(progname = nil, options = {})
  @progname = progname || "default"
  @level = options[:level] || DEBUG
  @threshold = options[:threshold] || ERROR
  @sizelimit = options[:sizelimit] || 100

  @buffer_mutex = Mutex.new
  @buffers = Hash.new do |progname_hash, pn|
    @buffer_mutex.synchronize do
      progname_hash[pn] = Hash.new do |severity_hash, severity|
        severity_hash[severity] = RingBuffer.new(@sizelimit)
      end
    end
  end

  # When the IncidentLogger itself encounters an error, it falls back to logging to stderr
  @fallback_logger = ::Logger.new(STDERR)
  @fallback_logger.progname = "FALLBACK"
end

Public Instance Methods

add(severity, message = nil, progname = nil, &block) click to toggle source

add an event.

# File lib/celluloid/logging/incident_logger.rb, line 66
def add(severity, message = nil, progname = nil, &block)
  progname ||= @progname
  severity ||= UNKNOWN

  return event.id if severity < @level

  if message.nil? && !block_given?
    message = progname
    progname = @progname
  end

  event = LogEvent.new(severity, message, progname, &block)

  @buffers[progname][severity] << event

  if severity >= @threshold
    begin
      Celluloid::Notifications.notifier.async.publish(incident_topic, create_incident(event))
    rescue => ex
      @fallback_logger.error(ex)
    end
  end
  event.id
end
Also aliased as: log
clear() click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 133
def clear
  @buffer_mutex.synchronize do
    @buffers.each(&:clear)
  end
end
create_incident(event = nil) click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 139
def create_incident(event = nil)
  Incident.new(flush, event)
end
debug(progname = nil, &block) click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 97
def debug(progname = nil, &block)
  add(DEBUG,   nil, progname, &block)
end
error(progname = nil, &block) click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 109
def error(progname = nil, &block)
  add(ERROR,   nil, progname, &block)
end
fatal(progname = nil, &block) click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 113
def fatal(progname = nil, &block)
  add(FATAL,   nil, progname, &block)
end
flush() click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 121
def flush
  messages = []
  @buffer_mutex.synchronize do
    @buffers.each do |_progname, severities|
      severities.each do |_severity, buffer|
        messages += buffer.flush
      end
    end
  end
  messages.sort
end
incident_topic() click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 143
def incident_topic
  "log.incident.#{@progname}"
end
info(progname = nil, &block) click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 101
def info(progname = nil, &block)
  add(INFO,    nil, progname, &block)
end
log(severity, message = nil, progname = nil, &block)
Alias for: add
trace(progname = nil, &block) click to toggle source

See docs for Logger#info

# File lib/celluloid/logging/incident_logger.rb, line 93
def trace(progname = nil, &block)
  add(TRACE,   nil, progname, &block)
end
unknown(progname = nil, &block) click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 117
def unknown(progname = nil, &block)
  add(UNKNOWN, nil, progname, &block)
end
warn(progname = nil, &block) click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 105
def warn(progname = nil, &block)
  add(WARN,    nil, progname, &block)
end