Class: Appsignal::Logger
Overview
Logger that flushes logs to the AppSignal logging service.
Instance Attribute Summary collapse
-
#level ⇒ Integer
readonly
Logging severity threshold.
Instance Method Summary collapse
-
#<<(message) ⇒ Integer
Log an info level message.
-
#broadcast_to(logger) ⇒ Array<Logger>
Adds a logger to broadcast log messages to.
-
#debug(message = nil, attributes = {}, &block) ⇒ void
Log a debug level message.
-
#error(message = nil, attributes = {}, &block) ⇒ void
Log an error level message.
-
#fatal(message = nil, attributes = {}, &block) ⇒ void
Log a fatal level message.
-
#formatter=(formatter) ⇒ Proc
Sets the formatter for this logger and all broadcasted loggers.
-
#info(message = nil, attributes = {}, &block) ⇒ void
Log an info level message.
-
#initialize(group, level: INFO, format: AUTODETECT, attributes: {}) ⇒ void
constructor
Create a new logger instance.
-
#silence(severity = ERROR, &block) ⇒ Object
Temporarily silences the logger to a specified level while executing a block.
-
#warn(message = nil, attributes = {}, &block) ⇒ void
Log a warn level message.
Constructor Details
#initialize(group, level: INFO, format: AUTODETECT, attributes: {}) ⇒ void
Create a new logger instance
78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/appsignal/logger.rb', line 78 def initialize(group, level: INFO, format: AUTODETECT, attributes: {}) raise TypeError, "group must be a string" unless group.is_a? String @group = group @level = level @silenced = false @format = format @mutex = Mutex.new @default_attributes = attributes @appsignal_attributes = attributes @loggers = [] end |
Instance Attribute Details
#level ⇒ Integer (readonly)
Logging severity threshold
68 69 70 |
# File 'lib/appsignal/logger.rb', line 68 def level @level end |
Instance Method Details
#<<(message) ⇒ Integer
Log an info level message
Returns the number of characters written.
203 204 205 206 |
# File 'lib/appsignal/logger.rb', line 203 def <<() info() .length end |
#broadcast_to(logger) ⇒ Array<Logger>
Adds a logger to broadcast log messages to.
This implementation of the broadcasting logic exists here in the AppSignal Ruby gem, because it doesn’t work in Rails using tagged logging. It would log a log line as many times as there are ‘Rails.logger.tagged` calls wrapping it.
For example, this setup with one log line:
“‘ruby appsignal_logger = Appsignal::Logger.new(“rails”) Rails.logger.broadcast_to(appsignal_logger)
Rails.logger.tagged(“my tag”) do
Rails.logger.tagged("my nested tag") do
Rails.logger.info("Nested log")
end
end “‘
Is logged as the following to the AppSignal logger. Each combination of tags is sent separately.
“‘ Nested log
- my nested tag
-
Nested log
- my tag
-
Nested log
- my tag
- my nested tag
-
Nested log
“‘
Once it’s fixed in Rails, it can be removed here.
Related issues and PRs:
Another issue was that the Rails ‘.broadcast_to` implementation in `ActiveSupport::BroadcastLogger` will run the block passed to `.tagged` as many times as there are loggers. Very early in the Rails execution stack, a middleware runs `logger.tagged(…) { @app.call(env) }`. This would cause the request handler to run twice, and it also causes the Rack response to be an array of Rack responses instead, which breaks the app entirely.
Related issues:
285 286 287 |
# File 'lib/appsignal/logger.rb', line 285 def broadcast_to(logger) @loggers << logger end |
#debug(message = nil, attributes = {}, &block) ⇒ void
This method returns an undefined value.
Log a debug level message
161 162 163 |
# File 'lib/appsignal/logger.rb', line 161 def debug( = nil, attributes = {}, &block) add_with_attributes(DEBUG, , @group, attributes, &block) end |
#error(message = nil, attributes = {}, &block) ⇒ void
This method returns an undefined value.
Log an error level message
185 186 187 |
# File 'lib/appsignal/logger.rb', line 185 def error( = nil, attributes = {}, &block) add_with_attributes(ERROR, , @group, attributes, &block) end |
#fatal(message = nil, attributes = {}, &block) ⇒ void
This method returns an undefined value.
Log a fatal level message
193 194 195 |
# File 'lib/appsignal/logger.rb', line 193 def fatal( = nil, attributes = {}, &block) add_with_attributes(FATAL, , @group, attributes, &block) end |
#formatter=(formatter) ⇒ Proc
Sets the formatter for this logger and all broadcasted loggers.
94 95 96 97 98 99 |
# File 'lib/appsignal/logger.rb', line 94 def formatter=(formatter) super @loggers.each do |logger| logger.formatter = formatter if logger.respond_to?(:formatter=) end end |
#info(message = nil, attributes = {}, &block) ⇒ void
This method returns an undefined value.
Log an info level message
169 170 171 |
# File 'lib/appsignal/logger.rb', line 169 def info( = nil, attributes = {}, &block) add_with_attributes(INFO, , @group, attributes, &block) end |
#silence(severity = ERROR, &block) ⇒ Object
Temporarily silences the logger to a specified level while executing a block.
When using ActiveSupport::TaggedLogging without the broadcast feature, the passed logger is required to respond to the ‘silence` method.
Reference links:
220 221 222 223 224 225 226 227 228 |
# File 'lib/appsignal/logger.rb', line 220 def silence(severity = ERROR, &block) previous_level = @level @level = severity @silenced = true block.call(self) ensure @level = previous_level @silenced = false end |
#warn(message = nil, attributes = {}, &block) ⇒ void
This method returns an undefined value.
Log a warn level message
177 178 179 |
# File 'lib/appsignal/logger.rb', line 177 def warn( = nil, attributes = {}, &block) add_with_attributes(WARN, , @group, attributes, &block) end |