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
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