module GovukLogging::RailsExt::ActionDispatch

Public Class Methods

monkey_patch_log_error(clazz = ::ActionDispatch::DebugExceptions) click to toggle source
# File lib/govuk_app_config/rails_ext/action_dispatch/debug_exceptions.rb, line 28
def self.monkey_patch_log_error(clazz = ::ActionDispatch::DebugExceptions)
  clazz.class_eval do
    private

    def log_error(request, wrapper)
      logger = logger(request)

      return unless logger

      exception = wrapper.exception

      trace = wrapper.application_trace
      trace = wrapper.framework_trace if trace.empty?

      logger.fatal({
        exception_class: exception.class.to_s,
        exception_message: exception.message,
        stacktrace: trace,
      }.to_json)
    end
  end
end
should_monkey_patch_log_error?(clazz = ::ActionDispatch::DebugExceptions) click to toggle source
# File lib/govuk_app_config/rails_ext/action_dispatch/debug_exceptions.rb, line 6
def self.should_monkey_patch_log_error?(clazz = ::ActionDispatch::DebugExceptions)
  empty_instance = clazz.new nil
  target_method = empty_instance.method :log_error

  expected_parameters = [%i[req request], %i[req wrapper]]
  actual_parameters = target_method.parameters

  should_monkey_patch = actual_parameters == expected_parameters

  unless should_monkey_patch
    Rails.logger.warn "Refused to monkey patch ::ActionDispatch::DebugExceptions#log_error - " \
      "signatures do not match. " \
      "Expected #{expected_parameters}, but got #{actual_parameters}"
  end

  should_monkey_patch
rescue StandardError => e
  Rails.logger.warn "Failed to detect whether to monkey patch " \
    "::ActionDispatch::DebugExceptions#log_error - #{e.inspect}"
  false
end

Public Instance Methods

log_error(request, wrapper) click to toggle source
# File lib/govuk_app_config/rails_ext/action_dispatch/debug_exceptions.rb, line 32
def log_error(request, wrapper)
  logger = logger(request)

  return unless logger

  exception = wrapper.exception

  trace = wrapper.application_trace
  trace = wrapper.framework_trace if trace.empty?

  logger.fatal({
    exception_class: exception.class.to_s,
    exception_message: exception.message,
    stacktrace: trace,
  }.to_json)
end