Sha256: 8efc1d3d4aa9c4c5aa978456fa36f515db1053e81a8248ef2901ea88bff45e56

Contents?: true

Size: 1.8 KB

Versions: 1

Compression:

Stored size: 1.8 KB

Contents

module Services
  class Base
    module CallLogger
      def self.prepended(mod)
        mod.extend ClassMethods
      end

      module ClassMethods
        attr_accessor :call_logging_disabled

        def disable_call_logging
          @call_logging_disabled = true
        end

        def enable_call_logging
          @call_logging_disabled = false
        end
      end

      def call(*args)
        return super if Services.configuration.logger.nil?
        unless self.class.call_logging_disabled
          log "START with args: #{args}", caller: caller
          start = Time.now
        end
        begin
          result = super
        rescue => e
          log exception_message(e), {}, 'error'
          raise e
        ensure
          log 'END', duration: (Time.now - start).round(2) unless self.class.call_logging_disabled
          result
        end
      end

      private

      def log(message, meta = {}, severity = 'info')
        Services.configuration.logger.log message, meta.merge(service: self.class.to_s, id: @id), severity
      end

      def exception_message(e)
        message = "#{e.class}: #{e.message}"
        e.backtrace.each do |line|
          message << "\n  #{line}"
        end
        message << "\ncaused by: #{exception_message(e.cause)}" if e.respond_to?(:cause) && e.cause
        message
      end

      def caller
        caller_location = caller_locations(1, 10).detect do |location|
          location.path !~ /\A#{Regexp.escape File.expand_path('../..', __FILE__)}/
        end
        if caller_location.nil?
          nil
        else
          caller_path = caller_location.path
          caller_path = caller_path.sub(%r(\A#{Regexp.escape Rails.root.to_s}/), '') if defined?(Rails)
          [caller_path, caller_location.lineno].join(':')
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
services-2.0.0 lib/services/modules/call_logger.rb