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, _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
trace(progname=nil, &block)
click to toggle source
See docs for Celluloid::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