Parent

Class/Module Index [+]

Quicksearch

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, _progname|
    @buffer_mutex.synchronize do
      progname_hash[_progname] = 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

  if severity < @level
    return event.id
  end

  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 115
def clear
  @buffer_mutex.synchronize do
    @buffers.each { |buffer| buffer.clear }
  end
end
create_incident(event=nil) click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 121
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 96
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 99
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 100
def fatal   (progname=nil, &block); add(FATAL,   nil, progname, &block); end
flush() click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 103
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 125
def incident_topic
  "log.incident.#{@progname}"
end
info(progname=nil, &block) click to toggle source
# File lib/celluloid/logging/incident_logger.rb, line 97
def info    (progname=nil, &block); add(INFO,    nil, progname, &block); end
log(severity, message=nil, progname=nil, &block) click to toggle source
Alias for: add
trace(progname=nil, &block) click to toggle source

See docs for Logger#info

# File lib/celluloid/logging/incident_logger.rb, line 95
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 101
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 98
def warn    (progname=nil, &block); add(WARN,    nil, progname, &block); end

[Validate]

Generated with the Darkfish Rdoc Generator 2.