class PaulBunyan::LogRelayer

Constants

DELEGATED_METHODS

delegate non-relayed methods to the primary logger

Attributes

loggers[R]

Public Class Methods

new() click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 44
def initialize
  @loggers = []
end

Public Instance Methods

<<(msg) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 56
def <<(msg)
  loggers.reduce(nil) do |memo, logger|
    n = logger << msg

    # this would be simpler with an array, but would generate unnecessary garbage
    if memo.nil? || n.nil?
      memo || n
    else
      memo < n ? memo : n
    end
  end
end
add(severity, message = nil, progname = nil, &block) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 48
def add(severity, message = nil, progname = nil, &block)
  block = memoized_block(&block) if block
  loggers.reduce(true) do |memo, logger|
    logger.add(severity, message, progname, &block) && memo
  end
end
Also aliased as: log
add_logger(logger) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 35
def add_logger(logger)
  loggers.push(logger)
  logger
end
add_metadata(metadata) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 143
def add_metadata(metadata)
  messaging_loggers(:add_metadata, metadata)
end
clear_metadata!() click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 147
def clear_metadata!
  messaging_loggers(:clear_metadata!)
end
clear_tags!() click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 128
def clear_tags!
  messaging_loggers(:clear_tags!)
end
current_metadata() click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 151
def current_metadata
  loggers.inject({}) do |agg, logger|
    if logger.respond_to?(:current_metadata)
      agg.merge(logger.current_metadata)
    else
      agg
    end
  end
end
current_tags() click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 111
def current_tags
  tags = loggers.each_with_object(Set.new) do |logger, set|
    set.merge(logger.current_tags) if logger.respond_to?(:current_tags)
  end
  tags.to_a
end
debug(progname = nil, &block) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 69
def debug(progname = nil, &block)
  add(DEBUG, nil, progname, &block)
end
error(progname = nil, &block) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 81
def error(progname = nil, &block)
  add(ERROR, nil, progname, &block)
end
fatal(progname = nil, &block) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 85
def fatal(progname = nil, &block)
  add(FATAL, nil, progname, &block)
end
flush() click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 132
def flush
  messaging_loggers(:flush)
end
info(progname = nil, &block) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 73
def info(progname = nil, &block)
  add(INFO, nil, progname, &block)
end
level() click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 93
def level
  logger = loggers.min { |a, b| a.level <=> b.level }
  logger.nil? ? DEBUG : logger.level
end
log(severity, message = nil, progname = nil, &block)
Alias for: add
pop_tags(size = 1) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 124
def pop_tags(size = 1)
  messaging_loggers(:pop_tags, size)
end
primary_logger() click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 27
def primary_logger
  loggers[0]
end
push_tags(*tags) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 118
def push_tags(*tags)
  tags.flatten.reject(&:blank?).tap do |new_tags|
    messaging_loggers(:push_tags, *new_tags)
  end
end
remove_logger(logger) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 40
def remove_logger(logger)
  loggers.delete(logger)
end
remove_metadata(metadata) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 161
def remove_metadata(metadata)
  messaging_loggers(:remove_metadata, metadata)
end
secondary_loggers() click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 31
def secondary_loggers
  loggers[1..-1] || []
end
silence(level = Logger::ERROR, &block) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 98
def silence(level = Logger::ERROR, &block)
  loggers = self.loggers.select { |l| l.respond_to?(:silence) }.reverse
  silencer = proc do
    logger = loggers.pop
    if logger
      logger.silence(level, &silencer)
    else
      block.call
    end
  end
  silencer.call
end
tagged(*tags) { |self| ... } click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 136
def tagged(*tags)
  new_tags = push_tags(*tags)
  yield self
ensure
  pop_tags(new_tags.size)
end
unknown(progname = nil, &block) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 89
def unknown(progname = nil, &block)
  add(UNKNOWN, nil, progname, &block)
end
warn(progname = nil, &block) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 77
def warn(progname = nil, &block)
  add(WARN, nil, progname, &block)
end
with_metadata(metadata) { || ... } click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 165
def with_metadata(metadata)
  add_metadata(metadata)
  yield
ensure
  remove_metadata(metadata)
end

Private Instance Methods

memoized_block(&block) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 174
def memoized_block(&block)
  called = false
  result = nil
  proc do
    next result if called
    called = true
    result = block.call
  end
end
messaging_loggers(required_method, *args) click to toggle source
# File lib/paul_bunyan/log_relayer.rb, line 184
def messaging_loggers(required_method, *args)
  loggers.each { |l| l.public_send(required_method, *args) if l.respond_to?(required_method) }
  nil
end