class Airbrake::AirbrakeLogger

Decorator for Logger from stdlib. Endows loggers the ability to both log and report errors to Airbrake.

@example

# Create a logger like you normally do and decorate it.
logger = Airbrake::AirbrakeLogger.new(Logger.new(STDOUT))

# Just use the logger like you normally do.
logger.fatal('oops')

Attributes

airbrake_level[R]

@return [Integer]

airbrake_notifier[RW]

@example

# Assign a custom Airbrake notifier
logger.airbrake_notifier = Airbrake::NoticeNotifier.new

@return [Airbrake::Notifier] notifier to be used to send notices

Public Class Methods

new(logger) click to toggle source
# File lib/airbrake/logger.rb, line 24
def initialize(logger)
  __setobj__(logger)
  @airbrake_notifier = Airbrake
  self.level = logger.level
end

Public Instance Methods

airbrake_level=(level) click to toggle source

Sets airbrake severity level. Does not permit values below `Logger::WARN`.

@example

logger.airbrake_level = Logger::FATAL

@return [void]

# File lib/airbrake/logger.rb, line 65
def airbrake_level=(level)
  if level < Logger::WARN
    raise "Airbrake severity level #{level} is not allowed. " \
          "Minimum allowed level is #{Logger::WARN}"
  end
  @airbrake_level = level
end
error(progname = nil, &block) click to toggle source

@see Logger#error

Calls superclass method
# File lib/airbrake/logger.rb, line 37
def error(progname = nil, &block)
  notify_airbrake(Logger::ERROR, progname)
  super
end
fatal(progname = nil, &block) click to toggle source

@see Logger#fatal

Calls superclass method
# File lib/airbrake/logger.rb, line 43
def fatal(progname = nil, &block)
  notify_airbrake(Logger::FATAL, progname)
  super
end
level=(value) click to toggle source

@see Logger#level=

Calls superclass method
# File lib/airbrake/logger.rb, line 55
def level=(value)
  self.airbrake_level = value < Logger::WARN ? Logger::WARN : value
  super
end
unknown(progname = nil, &block) click to toggle source

@see Logger#unknown

Calls superclass method
# File lib/airbrake/logger.rb, line 49
def unknown(progname = nil, &block)
  notify_airbrake(Logger::UNKNOWN, progname)
  super
end
warn(progname = nil, &block) click to toggle source

@see Logger#warn

Calls superclass method
# File lib/airbrake/logger.rb, line 31
def warn(progname = nil, &block)
  notify_airbrake(Logger::WARN, progname)
  super
end

Private Instance Methods

normalize_severity(severity) click to toggle source
# File lib/airbrake/logger.rb, line 91
def normalize_severity(severity)
  (case severity
   when Logger::WARN then 'warning'
   when Logger::ERROR, Logger::UNKNOWN then 'error'
   when Logger::FATAL then 'critical'
   else
     raise "Unknown airbrake severity: #{severity}"
   end).freeze
end
notify_airbrake(severity, progname) click to toggle source
# File lib/airbrake/logger.rb, line 75
def notify_airbrake(severity, progname)
  return if severity < @airbrake_level || !@airbrake_notifier

  @airbrake_notifier.notify(progname) do |notice|
    # Get rid of unwanted internal Logger frames. Examples:
    # * /ruby-2.4.0/lib/ruby/2.4.0/logger.rb
    # * /gems/activesupport-4.2.7.1/lib/active_support/logger.rb
    backtrace = notice[:errors].first[:backtrace]
    notice[:errors].first[:backtrace] =
      backtrace.drop_while { |frame| frame[:file] =~ %r{/logger.rb\z} }

    notice[:context][:component] = 'log'
    notice[:context][:severity] = normalize_severity(severity)
  end
end