Class: ActiveSupport::BroadcastLogger
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Instance Chain:
|
|
Inherits: | Object |
Defined in: | activesupport/lib/active_support/broadcast_logger.rb |
Overview
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]
LoggerSilence
- Attributes & Methods
Class Method Summary
- .new(*loggers) ⇒ BroadcastLogger constructor
Instance Attribute Summary
-
#broadcasts
readonly
Returns all the logger that are part of this broadcast.
-
#debug? ⇒ Boolean
readonly
True
if the log level allows entries with severityLogger::DEBUG
to be written to at least one broadcast. -
#error? ⇒ Boolean
readonly
True
if the log level allows entries with severityLogger::ERROR
to be written to at least one broadcast. -
#fatal? ⇒ Boolean
readonly
True
if the log level allows entries with severityLogger::FATAL
to be written to at least one broadcast. - #formatter rw
- #formatter=(formatter) rw
-
#info? ⇒ Boolean
readonly
True
if the log level allows entries with severityLogger::INFO
to be written to at least one broadcast. - #level rw
- #level=(level) (also: #sev_threshold=) rw
- #local_level=(level) writeonly
- #progname rw
-
#warn? ⇒ Boolean
readonly
True
if the log level allows entries with severityLogger::WARN
to be written to at least one broadcast.
LoggerThreadSafeLevel
- self
Instance Method Summary
- #<<(message)
- #add (also: #log)
-
#broadcast_to(*loggers)
Add logger(s) to the broadcast.
- #close
- #debug readonly
-
#debug!
Sets the log level to
Logger::DEBUG
for the whole broadcast. - #error readonly
-
#error!
Sets the log level to
Logger::ERROR
for the whole broadcast. - #fatal readonly
-
#fatal!
Sets the log level to
Logger::FATAL
for the whole broadcast. - #info readonly
-
#info!
Sets the log level to
Logger::INFO
for the whole broadcast. - #initialize_copy(other)
-
#log
Alias for #add.
-
#stop_broadcasting_to(logger)
Remove a logger from the broadcast.
- #unknown
- #warn readonly
-
#warn!
Sets the log level to
Logger::WARN
for the whole broadcast. - #dispatch(&block) private
- #method_missing(name) private
- #respond_to_missing?(method, include_all) ⇒ Boolean private
LoggerThreadSafeLevel
- self
#level, | |
#log_at | Change the thread-local level for the duration of the given block. |
#local_level_key |
LoggerSilence
- Included
#silence | Silences the logger for the duration of the block. |
Constructor Details
.new(*loggers) ⇒ BroadcastLogger
# File 'activesupport/lib/active_support/broadcast_logger.rb', line 82
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) (private)
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 235
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
Class Attribute Details
.silencer (rw) Also known as: #silencer
[ GitHub ]# File 'activesupport/lib/active_support/logger_silence.rb', line 12
cattr_accessor :silencer, default: true
Instance Attribute Details
#broadcasts (readonly)
Returns all the logger that are part of this broadcast.
# File 'activesupport/lib/active_support/broadcast_logger.rb', line 78
attr_reader :broadcasts
#debug? ⇒ Boolean
(readonly)
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
#error? ⇒ Boolean
(readonly)
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
#fatal? ⇒ Boolean
(readonly)
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
#formatter (rw)
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 79
attr_reader :formatter
#formatter=(formatter) (rw)
[ GitHub ]
#info? ⇒ Boolean
(readonly)
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
#level (rw)
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 108
def level @broadcasts.map(&:level).min end
#level=(level) (rw) Also known as: #sev_threshold=
[ GitHub ]#local_level=(level) (writeonly)
[ GitHub ]#progname (rw)
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 80
attr_accessor :progname
#silencer (rw)
[ GitHub ]# File 'activesupport/lib/active_support/logger_silence.rb', line 12
cattr_accessor :silencer, default: true
#warn? ⇒ Boolean
(readonly)
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
Instance Method Details
#<<(message)
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 112
def <<( ) dispatch { |logger| logger.<<( ) } end
#add Also known as: #log
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 116
def add(...) dispatch { |logger| logger.add(...) } end
#broadcast_to(*loggers)
# File 'activesupport/lib/active_support/broadcast_logger.rb', line 93
def broadcast_to(*loggers) @broadcasts.concat(loggers) end
#close
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 162
def close dispatch { |logger| logger.close } end
#debug (readonly)
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 121
def debug(...) dispatch { |logger| logger.debug(...) } end
#debug!
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
#dispatch(&block) (private)
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 230
def dispatch(&block) @broadcasts.each { |logger| block.call(logger) } true end
#error (readonly)
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 133
def error(...) dispatch { |logger| logger.error(...) } end
#error!
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
#fatal (readonly)
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 137
def fatal(...) dispatch { |logger| logger.fatal(...) } end
#fatal!
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
#info (readonly)
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 125
def info(...) dispatch { |logger| logger.info(...) } end
#info!
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
#initialize_copy(other)
[ GitHub ]# 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
#log
Alias for #add.
# File 'activesupport/lib/active_support/broadcast_logger.rb', line 119
alias_method :log, :add
#respond_to_missing?(method, include_all) ⇒ Boolean
(private)
# File 'activesupport/lib/active_support/broadcast_logger.rb', line 247
def respond_to_missing?(method, include_all) @broadcasts.any? { |logger| logger.respond_to?(method, include_all) } end
#stop_broadcasting_to(logger)
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
#unknown
[ GitHub ]# File 'activesupport/lib/active_support/broadcast_logger.rb', line 141
def unknown(...) dispatch { |logger| logger.unknown(...) } end
#warn (readonly)
[ GitHub ]#warn!
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