Sha256: ad667e7c11b4ed0cfec009670cf91415c19208857b516b55e6dfd8847ed0fc08

Contents?: true

Size: 1.66 KB

Versions: 2

Compression:

Stored size: 1.66 KB

Contents

require 'logger'

module ActiveRecordProfiler
  class Logger < SimpleDelegator

    def add(severity, message = nil, progname = nil, &block)
      return true if (severity || ::Logger::Severity::UNKNOWN) < self.level

      if message.nil?
        if block_given?
          message = yield
        else
          message = progname
          progname = self.progname
        end
      end

      message = add_call_site_to_message(message)

      super(severity, message, progname, &block)
    end

    # Define all of the basic logging methods so that they invoke our add()
    # method rather than delegating to the delagatee's methods, which will then
    # invoke the delegatee's add() method that does not add call-site 
    # information.
    [:debug, :info, :warn, :error, :fatal, :unknown].each do |level|
      define_method(level) do |progname = nil, &block|
        add(
            ::Logger::Severity.const_get(level.to_s.upcase),
            nil,
            progname,
            &block
        )
      end
    end

    protected
      def add_call_site_to_message(msg)
        message = msg

        if String === msg 
          match = /^\s*(?:\e\[\d+m)*(:?[^(]*)\(([0-9.]+)\s*([a-z]s(:?econds)?)\)(?:\e\[\d+m)*\s*(.*)/.match(msg)

          if match
            loc = collector.call_location_name
            message = "#{msg} CALLED BY '#{formatted_location(loc)}'"
          end
        end

        return message
      end
  
      def collector
        ActiveRecordProfiler::Collector.instance
      end

      def formatted_location(loc)
        if Rails.configuration.colorize_logging
          "\e[4;32;1m#{loc}\e[0m"
        else
          loc
        end
      end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
active-record-profiler-1.0 lib/active-record-profiler/logger.rb
active-record-profiler-0.1 lib/active-record-profiler/logger.rb