class ActiveSupport::BroadcastLogger

Active Support Broadcast Logger

The Broadcast logger is a logger used to write messages to multiple IO. It is commonly used in development to display messages on STDOUT and also write them to a file (development.log). With the Broadcast logger, you can broadcast your logs to a unlimited number of sinks.

The BroadcastLogger acts as a standard logger and all methods you are used to are available. However, all the methods on this logger will propagate and be delegated to the other loggers that are part of the broadcast.

Broadcasting your logs.

stdout_logger = Logger.new(STDOUT)
file_logger   = Logger.new("development.log")
broadcast = BroadcastLogger.new(stdout_logger, file_logger)

broadcast.info("Hello world!") # Writes the log to STDOUT and the development.log file.

Add a logger to the broadcast.

stdout_logger = Logger.new(STDOUT)
broadcast = BroadcastLogger.new(stdout_logger)
file_logger   = Logger.new("development.log")
broadcast.broadcast_to(file_logger)

broadcast.info("Hello world!") # Writes the log to STDOUT and the development.log file.

Modifying the log level for all broadcasted loggers.

stdout_logger = Logger.new(STDOUT)
file_logger   = Logger.new("development.log")
broadcast = BroadcastLogger.new(stdout_logger, file_logger)

broadcast.level = Logger::FATAL # Modify the log level for the whole broadcast.

Stop broadcasting log to a sink.

stdout_logger = Logger.new(STDOUT)
file_logger   = Logger.new("development.log")
broadcast = BroadcastLogger.new(stdout_logger, file_logger)
broadcast.info("Hello world!") # Writes the log to STDOUT and the development.log file.

broadcast.stop_broadcasting_to(file_logger)
broadcast.info("Hello world!") # Writes the log *only* to STDOUT.

At least one sink has to be part of the broadcast. Otherwise, your logs will not be written anywhere. For instance:

broadcast = BroadcastLogger.new
broadcast.info("Hello world") # The log message will appear nowhere.

Attributes

broadcasts[R]

Returns all the logger that are part of this broadcast.

formatter[R]
progname[RW]

Public Class Methods

new(*loggers) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 62
def initialize(*loggers)
  @broadcasts = []
  @progname = "Broadcast"

  broadcast_to(*loggers)
end

Public Instance Methods

<<(message) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 92
def <<(message)
  dispatch { |logger| logger.<<(message) }
end
add(*args, &block) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 96
def add(*args, &block)
  dispatch { |logger| logger.add(*args, &block) }
end
Also aliased as: log
broadcast_to(*loggers) click to toggle source

Add logger(s) to the broadcast.

broadcast_logger = ActiveSupport::BroadcastLogger.new
broadcast_logger.broadcast_to(Logger.new(STDOUT), Logger.new(STDERR))
# File lib/active_support/broadcast_logger.rb, line 73
def broadcast_to(*loggers)
  @broadcasts.concat(loggers)
end
close() click to toggle source
# File lib/active_support/broadcast_logger.rb, line 142
def close
  dispatch { |logger| logger.close }
end
debug(*args, &block) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 101
def debug(*args, &block)
  dispatch { |logger| logger.debug(*args, &block) }
end
debug!() click to toggle source

Sets the log level to Logger::DEBUG for the whole broadcast.

# File lib/active_support/broadcast_logger.rb, line 153
def debug!
  dispatch { |logger| logger.debug! }
end
debug?() click to toggle source

True if the log level allows entries with severity Logger::DEBUG to be written to at least one broadcast. False otherwise.

# File lib/active_support/broadcast_logger.rb, line 148
def debug?
  @broadcasts.any? { |logger| logger.debug? }
end
error(*args, &block) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 113
def error(*args, &block)
  dispatch { |logger| logger.error(*args, &block) }
end
error!() click to toggle source

Sets the log level to Logger::ERROR for the whole broadcast.

# File lib/active_support/broadcast_logger.rb, line 186
def error!
  dispatch { |logger| logger.error! }
end
error?() click to toggle source

True if the log level allows entries with severity Logger::ERROR to be written to at least one broadcast. False otherwise.

# File lib/active_support/broadcast_logger.rb, line 181
def error?
  @broadcasts.any? { |logger| logger.error? }
end
fatal(*args, &block) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 117
def fatal(*args, &block)
  dispatch { |logger| logger.fatal(*args, &block) }
end
fatal!() click to toggle source

Sets the log level to Logger::FATAL for the whole broadcast.

# File lib/active_support/broadcast_logger.rb, line 197
def fatal!
  dispatch { |logger| logger.fatal! }
end
fatal?() click to toggle source

True if the log level allows entries with severity Logger::FATAL to be written to at least one broadcast. False otherwise.

# File lib/active_support/broadcast_logger.rb, line 192
def fatal?
  @broadcasts.any? { |logger| logger.fatal? }
end
formatter=(formatter) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 125
def formatter=(formatter)
  dispatch { |logger| logger.formatter = formatter }

  @formatter = formatter
end
info(*args, &block) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 105
def info(*args, &block)
  dispatch { |logger| logger.info(*args, &block) }
end
info!() click to toggle source

Sets the log level to Logger::INFO for the whole broadcast.

# File lib/active_support/broadcast_logger.rb, line 164
def info!
  dispatch { |logger| logger.info! }
end
info?() click to toggle source

True if the log level allows entries with severity Logger::INFO to be written to at least one broadcast. False otherwise.

# File lib/active_support/broadcast_logger.rb, line 159
def info?
  @broadcasts.any? { |logger| logger.info? }
end
level() click to toggle source
# File lib/active_support/broadcast_logger.rb, line 88
def level
  @broadcasts.map(&:level).min
end
level=(level) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 131
def level=(level)
  dispatch { |logger| logger.level = level }
end
Also aliased as: sev_threshold=
local_level=(level) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 136
def local_level=(level)
  dispatch do |logger|
    logger.local_level = level if logger.respond_to?(:local_level=)
  end
end
log(*args, &block)
Alias for: add
sev_threshold=(level)
Alias for: level=
stop_broadcasting_to(logger) click to toggle source

Remove a logger from the broadcast. When a logger is removed, messages sent to the broadcast will no longer be written to its sink.

sink = Logger.new(STDOUT)
broadcast_logger = ActiveSupport::BroadcastLogger.new

broadcast_logger.stop_broadcasting_to(sink)
# File lib/active_support/broadcast_logger.rb, line 84
def stop_broadcasting_to(logger)
  @broadcasts.delete(logger)
end
unknown(*args, &block) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 121
def unknown(*args, &block)
  dispatch { |logger| logger.unknown(*args, &block) }
end
warn(*args, &block) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 109
def warn(*args, &block)
  dispatch { |logger| logger.warn(*args, &block) }
end
warn!() click to toggle source

Sets the log level to Logger::WARN for the whole broadcast.

# File lib/active_support/broadcast_logger.rb, line 175
def warn!
  dispatch { |logger| logger.warn! }
end
warn?() click to toggle source

True if the log level allows entries with severity Logger::WARN to be written to at least one broadcast. False otherwise.

# File lib/active_support/broadcast_logger.rb, line 170
def warn?
  @broadcasts.any? { |logger| logger.warn? }
end

Private Instance Methods

dispatch(&block) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 202
def dispatch(&block)
  @broadcasts.each { |logger| block.call(logger) }
end
method_missing(name, *args, &block) click to toggle source
Calls superclass method
# File lib/active_support/broadcast_logger.rb, line 206
def method_missing(name, *args, &block)
  loggers = @broadcasts.select { |logger| logger.respond_to?(name) }

  if loggers.none?
    super(name, *args, &block)
  elsif loggers.one?
    loggers.first.send(name, *args, &block)
  else
    loggers.map { |logger| logger.send(name, *args, &block) }
  end
end
respond_to_missing?(method, include_all) click to toggle source
# File lib/active_support/broadcast_logger.rb, line 218
def respond_to_missing?(method, include_all)
  @broadcasts.any? { |logger| logger.respond_to?(method, include_all) }
end