Class: ActiveSupport::BroadcastLogger
- Includes:
 - LoggerSilence
 
- Defined in:
 - lib/active_support/broadcast_logger.rb
 
Overview
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]
  Constant Summary collapse
- LOGGER_METHODS =
 %w[ << log add debug info warn error fatal unknown level= sev_threshold= close formatter formatter= ]
Instance Attribute Summary collapse
- 
  
    
      #broadcasts  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    
Returns all the logger that are part of this broadcast.
 - 
  
    
      #progname  ⇒ Object 
    
    
  
  
  
  
    
    
  
  
  
  
  
  
    
Returns the value of attribute progname.
 
Instance Method Summary collapse
- 
  
    
      #broadcast_to(*loggers)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Add logger(s) to the broadcast.
 - 
  
    
      #debug!  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Sets the log level to
Logger::DEBUGfor the whole broadcast. - 
  
    
      #debug?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
True if the log level allows entries with severity
Logger::DEBUGto be written to at least one broadcast. - 
  
    
      #error!  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Sets the log level to
Logger::ERRORfor the whole broadcast. - 
  
    
      #error?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
True if the log level allows entries with severity
Logger::ERRORto be written to at least one broadcast. - 
  
    
      #fatal!  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Sets the log level to
Logger::FATALfor the whole broadcast. - 
  
    
      #fatal?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
True if the log level allows entries with severity
Logger::FATALto be written to at least one broadcast. - 
  
    
      #info!  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Sets the log level to
Logger::INFOfor the whole broadcast. - 
  
    
      #info?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
True if the log level allows entries with severity
Logger::INFOto be written to at least one broadcast. - 
  
    
      #initialize(*loggers)  ⇒ BroadcastLogger 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    
A new instance of BroadcastLogger.
 - #initialize_copy(other) ⇒ Object
 - 
  
    
      #level  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Returns the lowest level of all the loggers in the broadcast.
 - #local_level ⇒ Object
 - #local_level=(level) ⇒ Object
 - 
  
    
      #stop_broadcasting_to(logger)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Remove a logger from the broadcast.
 - 
  
    
      #warn!  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Sets the log level to
Logger::WARNfor the whole broadcast. - 
  
    
      #warn?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
True if the log level allows entries with severity
Logger::WARNto be written to at least one broadcast. 
Methods included from LoggerSilence
Methods included from Concern
#append_features, #class_methods, extended, #included, #prepend_features, #prepended
Constructor Details
#initialize(*loggers) ⇒ BroadcastLogger
Returns a new instance of BroadcastLogger.
      81 82 83 84 85 86  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 81 def initialize(*loggers) @broadcasts = [] @progname = "Broadcast" broadcast_to(*loggers) end  | 
  
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name) ⇒ Object (private)
      222 223 224 225 226 227 228 229 230 231 232  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 222 def method_missing(name, ...) loggers = @broadcasts.select { |logger| logger.respond_to?(name) } if loggers.none? super elsif loggers.one? loggers.first.send(name, ...) else loggers.map { |logger| logger.send(name, ...) } end end  | 
  
Instance Attribute Details
#broadcasts ⇒ Object (readonly)
Returns all the logger that are part of this broadcast.
      78 79 80  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 78 def broadcasts @broadcasts end  | 
  
#progname ⇒ Object
Returns the value of attribute progname.
      79 80 81  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 79 def progname @progname end  | 
  
Instance Method Details
#broadcast_to(*loggers) ⇒ Object
Add logger(s) to the broadcast.
broadcast_logger = ActiveSupport::BroadcastLogger.new
broadcast_logger.broadcast_to(Logger.new(STDOUT), Logger.new(STDERR))
  
      92 93 94  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 92 def broadcast_to(*loggers) @broadcasts.concat(loggers) end  | 
  
#debug! ⇒ Object
Sets the log level to Logger::DEBUG for the whole broadcast.
      146 147 148  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 146 def debug! dispatch(:debug!) end  | 
  
#debug? ⇒ Boolean
True if the log level allows entries with severity Logger::DEBUG to be written to at least one broadcast. False otherwise.
      141 142 143  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 141 def debug? @broadcasts.any? { |logger| logger.debug? } end  | 
  
#error! ⇒ Object
Sets the log level to Logger::ERROR for the whole broadcast.
      179 180 181  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 179 def error! dispatch(:error!) end  | 
  
#error? ⇒ Boolean
True if the log level allows entries with severity Logger::ERROR to be written to at least one broadcast. False otherwise.
      174 175 176  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 174 def error? @broadcasts.any? { |logger| logger.error? } end  | 
  
#fatal! ⇒ Object
Sets the log level to Logger::FATAL for the whole broadcast.
      190 191 192  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 190 def fatal! dispatch(:fatal!) end  | 
  
#fatal? ⇒ Boolean
True if the log level allows entries with severity Logger::FATAL to be written to at least one broadcast. False otherwise.
      185 186 187  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 185 def fatal? @broadcasts.any? { |logger| logger.fatal? } end  | 
  
#info! ⇒ Object
Sets the log level to Logger::INFO for the whole broadcast.
      157 158 159  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 157 def info! dispatch(:info!) end  | 
  
#info? ⇒ Boolean
True if the log level allows entries with severity Logger::INFO to be written to at least one broadcast. False otherwise.
      152 153 154  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 152 def info? @broadcasts.any? { |logger| logger.info? } end  | 
  
#initialize_copy(other) ⇒ Object
      194 195 196 197 198 199  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 194 def initialize_copy(other) @broadcasts = [] @progname = other.progname.dup broadcast_to(*other.broadcasts.map(&:dup)) end  | 
  
#level ⇒ Object
Returns the lowest level of all the loggers in the broadcast.
      135 136 137  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 135 def level @broadcasts.map(&:level).min end  | 
  
#local_level ⇒ Object
      113 114 115 116 117 118 119  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 113 def local_level loggers = @broadcasts.select { |logger| logger.respond_to?(:local_level) } loggers.map do |logger| logger.local_level end.first end  | 
  
#local_level=(level) ⇒ Object
      107 108 109 110 111  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 107 def local_level=(level) @broadcasts.each do |logger| logger.local_level = level if logger.respond_to?(:local_level=) end end  | 
  
#stop_broadcasting_to(logger) ⇒ Object
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)
  
      103 104 105  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 103 def stop_broadcasting_to(logger) @broadcasts.delete(logger) end  | 
  
#warn! ⇒ Object
Sets the log level to Logger::WARN for the whole broadcast.
      168 169 170  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 168 def warn! dispatch(:warn!) end  | 
  
#warn? ⇒ Boolean
True if the log level allows entries with severity Logger::WARN to be written to at least one broadcast. False otherwise.
      163 164 165  | 
    
      # File 'lib/active_support/broadcast_logger.rb', line 163 def warn? @broadcasts.any? { |logger| logger.warn? } end  |