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.
If you are adding a custom logger with custom methods to the broadcast, the ‘BroadcastLogger` will proxy them and return the raw value, or an array of raw values, depending on how many loggers in the broadcasts responded to the method:
class MyLogger < ::Logger def loggable? true end end logger = BroadcastLogger.new logger.loggable? # => A NoMethodError exception is raised because no loggers in the broadcasts could respond. logger.broadcast_to(MyLogger.new(STDOUT)) logger.loggable? # => true logger.broadcast_to(MyLogger.new(STDOUT)) puts logger.broadcasts # => [MyLogger, MyLogger] logger.loggable? # [true, true]
Attributes
Returns all the logger that are part of this broadcast.
Public Class Methods
# File activesupport/lib/active_support/broadcast_logger.rb, line 82 def initialize(*loggers) @broadcasts = [] @progname = "Broadcast" broadcast_to(*loggers) end
Public Instance Methods
# File activesupport/lib/active_support/broadcast_logger.rb, line 112 def <<(message) dispatch { |logger| logger.<<(message) } end
# File activesupport/lib/active_support/broadcast_logger.rb, line 116 def add(...) dispatch { |logger| logger.add(...) } end
Add logger(s) to the broadcast.
broadcast_logger = ActiveSupport::BroadcastLogger.new broadcast_logger.broadcast_to(Logger.new(STDOUT), Logger.new(STDERR))
# File activesupport/lib/active_support/broadcast_logger.rb, line 93 def broadcast_to(*loggers) @broadcasts.concat(loggers) end
# File activesupport/lib/active_support/broadcast_logger.rb, line 162 def close dispatch { |logger| logger.close } end
# File activesupport/lib/active_support/broadcast_logger.rb, line 121 def debug(...) dispatch { |logger| logger.debug(...) } end
Sets the log level to Logger::DEBUG
for the whole broadcast.
# File activesupport/lib/active_support/broadcast_logger.rb, line 173 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 activesupport/lib/active_support/broadcast_logger.rb, line 168 def debug? @broadcasts.any? { |logger| logger.debug? } end
# File activesupport/lib/active_support/broadcast_logger.rb, line 133 def error(...) dispatch { |logger| logger.error(...) } end
Sets the log level to Logger::ERROR
for the whole broadcast.
# File activesupport/lib/active_support/broadcast_logger.rb, line 206 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 activesupport/lib/active_support/broadcast_logger.rb, line 201 def error? @broadcasts.any? { |logger| logger.error? } end
# File activesupport/lib/active_support/broadcast_logger.rb, line 137 def fatal(...) dispatch { |logger| logger.fatal(...) } end
Sets the log level to Logger::FATAL
for the whole broadcast.
# File activesupport/lib/active_support/broadcast_logger.rb, line 217 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 activesupport/lib/active_support/broadcast_logger.rb, line 212 def fatal? @broadcasts.any? { |logger| logger.fatal? } end
# File activesupport/lib/active_support/broadcast_logger.rb, line 145 def formatter=(formatter) dispatch { |logger| logger.formatter = formatter } @formatter = formatter end
# File activesupport/lib/active_support/broadcast_logger.rb, line 125 def info(...) dispatch { |logger| logger.info(...) } end
Sets the log level to Logger::INFO
for the whole broadcast.
# File activesupport/lib/active_support/broadcast_logger.rb, line 184 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 activesupport/lib/active_support/broadcast_logger.rb, line 179 def info? @broadcasts.any? { |logger| logger.info? } end
# File activesupport/lib/active_support/broadcast_logger.rb, line 221 def initialize_copy(other) @broadcasts = [] @progname = other.progname.dup @formatter = other.formatter.dup broadcast_to(*other.broadcasts.map(&:dup)) end
# File activesupport/lib/active_support/broadcast_logger.rb, line 108 def level @broadcasts.map(&:level).min end
# File activesupport/lib/active_support/broadcast_logger.rb, line 151 def level=(level) dispatch { |logger| logger.level = level } end
# File activesupport/lib/active_support/broadcast_logger.rb, line 156 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 activesupport/lib/active_support/broadcast_logger.rb, line 104 def stop_broadcasting_to(logger) @broadcasts.delete(logger) end
# File activesupport/lib/active_support/broadcast_logger.rb, line 141 def unknown(...) dispatch { |logger| logger.unknown(...) } end
# File activesupport/lib/active_support/broadcast_logger.rb, line 129 def warn(...) dispatch { |logger| logger.warn(...) } end
Sets the log level to Logger::WARN
for the whole broadcast.
# File activesupport/lib/active_support/broadcast_logger.rb, line 195 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 activesupport/lib/active_support/broadcast_logger.rb, line 190 def warn? @broadcasts.any? { |logger| logger.warn? } end