public
Clone URL: git://github.com/defunkt/exception_logger.git
exception_logger / lib / logged_exception.rb
100644 67 lines (57 sloc) 2.337 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class LoggedException < ActiveRecord::Base
  class << self
    def create_from_exception(controller, exception, data)
      message = exception.message.inspect
      message << "\n* Extra Data\n\n#{data}" unless data.blank?
      create! \
        :exception_class => exception.class.name,
        :controller_name => controller.controller_name,
        :action_name => controller.action_name,
        :message => message,
        :backtrace => exception.backtrace,
        :request => controller.request
    end
    
    def find_exception_class_names
      connection.select_values "SELECT DISTINCT exception_class FROM #{table_name} ORDER BY exception_class"
    end
    
    def find_exception_controllers_and_actions
      find(:all, :select => "DISTINCT controller_name, action_name", :order => "controller_name, action_name").collect(&:controller_action)
    end
    
    def host_name
      `hostname -s`.chomp
    end
  end
 
  def backtrace=(backtrace)
    backtrace = sanitize_backtrace(backtrace) * "\n" unless backtrace.is_a?(String)
    write_attribute :backtrace, backtrace
  end
 
  def request=(request)
    if request.is_a?(String)
      write_attribute :request, request
    else
      max = request.env.keys.max { |a,b| a.length <=> b.length }
      env = request.env.keys.sort.inject [] do |env, key|
        env << '* ' + ("%-*s: %s" % [max.length, key, request.env[key].to_s.strip])
      end
      write_attribute(:environment, (env << "* Process: #{$$}" << "* Server : #{self.class.host_name}") * "\n")
      
      write_attribute(:request, [
        "* URL:#{" #{request.method.to_s.upcase}" unless request.get?} #{request.protocol}#{request.env["HTTP_HOST"]}#{request.request_uri}",
        "* Format: #{request.format.to_s}",
        "* Parameters: #{request.parameters.inspect}",
        "* Rails Root: #{rails_root}"
      ] * "\n")
    end
  end
 
  def controller_action
    @controller_action ||= "#{controller_name.camelcase}/#{action_name}"
  end
 
  private
    @@rails_root = Pathname.new(RAILS_ROOT).cleanpath.to_s
    @@backtrace_regex = /^#{Regexp.escape(@@rails_root)}/
 
    def sanitize_backtrace(trace)
      trace.collect { |line| Pathname.new(line.gsub(@@backtrace_regex, "[RAILS_ROOT]")).cleanpath.to_s }
    end
 
    def rails_root
      @@rails_root
    end
end