module NdrError::Logging

Module to contain helpers for logging

Constants

ANCILLARY_ATTRS_WHITELIST

Which attributes can be populated when manually logging an exception:

Public Instance Methods

log(exception, ancillary_data, request_object) click to toggle source

Log the given `exception`.

# File lib/ndr_error/logging.rb, line 8
def log(exception, ancillary_data, request_object)
  # Capture details about a parent exception, if possible:
  parent_print, = exception.cause && log(exception.cause, ancillary_data, request_object)

  log = initialize_log(ancillary_data)
  log.register_exception(exception)
  log.register_request(request_object)
  log.register_parent(parent_print)

  print = Fingerprint.find_or_create_by_id(log.md5_digest)
  print.causal_error_fingerprint = parent_print
  log = print.store_log(log)

  NdrError.run_after_log_callbacks(exception, print, log)

  [print, log]
end
monitor(ancillary_data: {}, request: nil, swallow: false) { || ... } click to toggle source
# File lib/ndr_error/logging.rb, line 26
def monitor(ancillary_data: {}, request: nil, swallow: false)
  yield
rescue Exception => exception # rubocop:disable Lint/RescueException
  data = log(exception, ancillary_data, request)
  swallow ? data : raise(exception)
end

Private Instance Methods

initialize_log(ancillary_data) click to toggle source

Manual attribute whitelisting:

# File lib/ndr_error/logging.rb, line 36
def initialize_log(ancillary_data)
  Log.new.tap do |log|
    ancillary_data.symbolize_keys.each do |key, value|
      raise "Mass-assigning #{key} is forbidden!" unless ANCILLARY_ATTRS_WHITELIST.include?(key)

      if ActiveRecord::Base.respond_to?(:protected_attributes)
        log.assign_attributes({ key => value }, without_protection: true)
      else
        log.assign_attributes(key => value)
      end
    end
  end
end