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
Returns all the logger that are part of this broadcast.
Public Class Methods
# File lib/active_support/broadcast_logger.rb, line 62 def initialize(*loggers) @broadcasts = [] @progname = "Broadcast" broadcast_to(*loggers) end
Public Instance Methods
# File lib/active_support/broadcast_logger.rb, line 92 def <<(message) dispatch { |logger| logger.<<(message) } end
# File lib/active_support/broadcast_logger.rb, line 96 def add(*args, &block) dispatch { |logger| logger.add(*args, &block) } end
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
# File lib/active_support/broadcast_logger.rb, line 142 def close dispatch { |logger| logger.close } end
# File lib/active_support/broadcast_logger.rb, line 101 def debug(*args, &block) dispatch { |logger| logger.debug(*args, &block) } end
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
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
# File lib/active_support/broadcast_logger.rb, line 113 def error(*args, &block) dispatch { |logger| logger.error(*args, &block) } end
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
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
# File lib/active_support/broadcast_logger.rb, line 117 def fatal(*args, &block) dispatch { |logger| logger.fatal(*args, &block) } end
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
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
# File lib/active_support/broadcast_logger.rb, line 125 def formatter=(formatter) dispatch { |logger| logger.formatter = formatter } @formatter = formatter end
# File lib/active_support/broadcast_logger.rb, line 105 def info(*args, &block) dispatch { |logger| logger.info(*args, &block) } end
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
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
# File lib/active_support/broadcast_logger.rb, line 88 def level @broadcasts.map(&:level).min end
# File lib/active_support/broadcast_logger.rb, line 131 def level=(level) dispatch { |logger| logger.level = level } end
# 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
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
# File lib/active_support/broadcast_logger.rb, line 121 def unknown(*args, &block) dispatch { |logger| logger.unknown(*args, &block) } end
# File lib/active_support/broadcast_logger.rb, line 109 def warn(*args, &block) dispatch { |logger| logger.warn(*args, &block) } end
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
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
# File lib/active_support/broadcast_logger.rb, line 202 def dispatch(&block) @broadcasts.each { |logger| block.call(logger) } end
# 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
# 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