error_log 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Changelog.txt CHANGED
@@ -1,3 +1,10 @@
1
+ 0.0.6 to be
2
+ * basic VCS awareness (currently git only)
3
+ * bugfix for showing errors from any category
4
+ * bugfix for sorting by level then count
5
+ * some cleanup, and a little bit of doc
6
+ * bugfix for migrations (add_index bug)
7
+
1
8
  0.0.5
2
9
  * haml dependency added (sorry folks, I could not stand rhtml
3
10
  * viewing archive
@@ -12,7 +12,7 @@ THIS IS AN EARLY DEVELOPMENT VERSION, DO NOT EVEN TOUCH PRODUCTION SERVER WITH I
12
12
  Actually, it is so unmature that even playing with it can make you sad.
13
13
  And no one likes to be sad.
14
14
 
15
- dev screenshot: http://tesuji.pl/error_logs.png
15
+ dev screenshot: http://tesuji.pl/error_logs.png (v 0.0.2)
16
16
 
17
17
  == REQUIREMENTS
18
18
 
@@ -53,15 +53,15 @@ To be continued.
53
53
 
54
54
  == TODOS
55
55
 
56
- * git (and other VCS) awareness
56
+ * alternative errors storage (for database failures, probably sqlite will do)
57
57
  * better params viewing (currently only example params)
58
58
  * setting error level threshold while browsing
59
59
  * better look (themes would be good, but I really do not like css, so help needed)
60
60
  * adding errors to ignore list
61
61
  * pagination could by nice ;) (it ain't actually so bad without it thanks to grouping)
62
- * alternative errors storage (for database failures, probably sqlite will do)
63
- * clickable backtraces? we could show some code
62
+ * clickable backtraces? we could try showing some code
64
63
  * rails 2.x compatibility
64
+ * svn & other vcs support
65
65
 
66
66
  == STUFF
67
67
 
@@ -0,0 +1,66 @@
1
+ module ErrorLog
2
+ module ClassMethods
3
+
4
+ def options
5
+ @options ||= {
6
+ :vcs => Vcs.guess
7
+ }
8
+ end
9
+
10
+ # Log error, exception, or whatever you have on your mind
11
+ #
12
+ # Args:
13
+ # * level - error level {:debug, :info, :warn, :error, :fatal}
14
+ # * error - error string itself
15
+ # * options
16
+ #
17
+ # Possible options:
18
+ # * :backtrace
19
+ # * :params - params that can help you recreate this error, Hash
20
+ # * :category - error category, helps you to group them later
21
+ #
22
+ def log(level,error,options={})
23
+ backtrace = options[:backtrace]
24
+ unless backtrace
25
+ begin
26
+ # I'm raising an exception just to get the current backtrace
27
+ # If there is any more clever way to do that, please share.
28
+ raise "wat?!"
29
+ rescue Exception => e
30
+ backtrace = e.backtrace[1..-1]
31
+ end
32
+ end
33
+
34
+ # Silent rescues may not be optimal, for now they seem better than creating more mess
35
+ logger.error "\n\n\n#{Time.now}\n= #{error}\n#{backtrace.join("\n")}\n#{options[:params]}" rescue nil
36
+
37
+ ErrorLog::Model.create(
38
+ :error => error,
39
+ :backtrace => backtrace,
40
+ :level => level,
41
+ :params => options[:params],
42
+ :vcs_revision => current_revision,
43
+ :category => options[:category] || 'error_log'
44
+ ) rescue nil
45
+ end
46
+
47
+ # Errors log, may be useful when you're facing some db related problems
48
+ def logger
49
+ @logger = Logger.new(File.join(Rails.root,'log','error.log'))
50
+ end
51
+
52
+ def init
53
+ @current_revision = Vcs.revision
54
+ Migrations.auto_migrate!
55
+ end
56
+
57
+ def current_revision
58
+ @current_revision
59
+ end
60
+
61
+ end
62
+
63
+ class << self
64
+ include ClassMethods
65
+ end
66
+ end
@@ -9,9 +9,10 @@ module ErrorLog
9
9
 
10
10
  prepare_opts
11
11
 
12
- scope = ErrorLog::Model
12
+ scope = cat_scope = rev_scope = ErrorLog::Model
13
13
 
14
- scope = scope.where(:category => @errors_category) unless @errors_category.to_s.empty?
14
+ scope = cat_scope = scope.where(:category => @opts[:category]) if @opts[:category]
15
+ scope = rev_scope = scope.where(:vcs_revision => @opts[:revision].empty? ? nil : @opts[:revision]) if @opts[:revision]
15
16
 
16
17
  @error_logs = scope.all(
17
18
  :select => 'count(*) as count_all,
@@ -30,11 +31,20 @@ module ErrorLog
30
31
  })
31
32
 
32
33
 
33
- @category_counts = ErrorLog::Model.count(
34
+ @category_counts = rev_scope.count(
34
35
  :conditions => {:viewed => viewing_archive?},
35
36
  :group => :category
36
37
  )
37
38
 
39
+ @revisions = cat_scope.all(
40
+ :select => 'vcs_revision,
41
+ min(created_at) as created_at_first,
42
+ count(*) as count_all',
43
+ :conditions => {:viewed => viewing_archive?},
44
+ :group => :vcs_revision,
45
+ :order => 'created_at_first'
46
+ )
47
+
38
48
  render :template => '/index'
39
49
  end
40
50
 
@@ -82,12 +92,13 @@ module ErrorLog
82
92
  'first' => 'created_at_first DESC',
83
93
  'count' => 'count_all DESC',
84
94
  'level' => 'level_id DESC',
85
- 'level_count' => 'level DESC, count_all DESC'
95
+ 'level_count' => 'level_id DESC, count_all DESC'
86
96
  }
87
97
 
88
98
  @opts = {
89
99
  :archive => '0',
90
100
  :sort_by => sorts['last'],
101
+ :revision => nil,
91
102
  :category => nil
92
103
  }
93
104
 
@@ -98,7 +109,12 @@ module ErrorLog
98
109
  @opts[:sort_by] = sorts[session[:erlgs_sort_by]]
99
110
 
100
111
  session[:erlgs_category] = params[:category] if params[:category]
101
- @opts[:category] = @errors_category = session[:erlgs_category]
112
+ session[:erlgs_category] = nil if params[:category] == '-none-'
113
+ @opts[:category] = session[:erlgs_category]
114
+
115
+ session[:erlgs_revision] = params[:revision] if params[:revision]
116
+ session[:erlgs_revision] = nil if params[:revision] == '-none-'
117
+ @opts[:revision] = session[:erlgs_revision]
102
118
  end
103
119
  end
104
120
  end
@@ -0,0 +1,10 @@
1
+ module ErrorLog
2
+ module Migrations
3
+ # ErrorLog 0.2 to 0.3 migration, creating params column
4
+ class AddParamsColumn < ActiveRecord::Migration
5
+ def self.up
6
+ add_column :error_logs, :params, :text
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module ErrorLog
2
+ module Migrations
3
+ # ErrorLog 0.2 to 0.3 migration, creating params column
4
+ class AddVcsRevisionColumn < ActiveRecord::Migration
5
+ def self.up
6
+ add_column :error_logs, :vcs_revision, :string
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,20 @@
1
+ module ErrorLog
2
+ module Migrations
3
+ # Base migration, create error_logs table
4
+ class Base < ActiveRecord::Migration
5
+ def self.up
6
+ create_table :error_logs do |t|
7
+ t.text :error
8
+ t.text :backtrace
9
+ t.string :category
10
+ t.string :error_hash
11
+ t.integer :level_id
12
+ t.timestamp :created_at
13
+ t.boolean :viewed, :default => false
14
+ end
15
+
16
+ add_index :error_logs, :category
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,25 +1,29 @@
1
1
  module ErrorLog
2
+ module Migrations
2
3
 
3
- class Migration < ActiveRecord::Migration
4
- def self.up
5
- create_table :error_logs do |t|
6
- t.text :error
7
- t.text :backtrace
8
- t.string :category
9
- # note to future me: "hash" is a really bad name for the column
10
- t.string :error_hash
11
- t.integer :level_id
12
- t.timestamp :created_at
13
- t.boolean :viewed, :default => false
4
+ # Chack what do we have in database and migratie what's needed
5
+ # Those migrations does not work like rails migrations, I check manually if table exists,
6
+ # or if given column exist, and add it if it's not there. I didnt want to use rails migrations
7
+ # to avoid messing with your database, and adding there anything more than the error_logs table
8
+ # that is needed. Also this way we dont have to care if you still use old kind of numbered
9
+ # migrations.
10
+ def self.auto_migrate!
11
+
12
+ unless Model.table_exists?
13
+ Base.up
14
+ Model.reset_column_information
14
15
  end
15
16
 
16
- add_index :error_hash, :category
17
- end
18
- end
17
+ unless Model.column_names.include?('params')
18
+ AddParamsColumn.up
19
+ Model.reset_column_information
20
+ end
21
+
22
+ unless Model.column_names.include?('vcs_revision')
23
+ AddVcsRevisionColumn.up
24
+ Model.reset_column_information
25
+ end
19
26
 
20
- class UpgradeMigration1 < ActiveRecord::Migration
21
- def self.up
22
- add_column :error_logs, :params, :text
23
27
  end
24
28
  end
25
29
 
@@ -5,18 +5,6 @@ module ErrorLog
5
5
 
6
6
  self.table_name = 'error_logs'
7
7
 
8
- # Migrate database if needed
9
- unless self.table_exists?
10
- Migration.up
11
- reset_column_information
12
- end
13
-
14
- # Upgrade if needed
15
- unless column_names.include?('params')
16
- UpgradeMigration1.up
17
- reset_column_information
18
- end
19
-
20
8
  LEVELS = {
21
9
  :debug => 0,
22
10
  :info => 1,
@@ -28,7 +16,6 @@ module ErrorLog
28
16
  }
29
17
 
30
18
  serialize :params, Hash
31
- attr_accessor :count # used in grouping
32
19
 
33
20
  def level
34
21
  LEVELS.invert[self.level_id]
@@ -47,6 +34,8 @@ module ErrorLog
47
34
 
48
35
  obj.error_hash = Digest::MD5.hexdigest(obj.backtrace.to_s + obj.error.to_s + obj.category.to_s)
49
36
 
37
+ obj.vcs_revision = nil if vcs_revision.empty?
38
+
50
39
  true
51
40
  end
52
41
 
@@ -0,0 +1,23 @@
1
+ module ErrorLog
2
+ # VCS would be a better name, I'm just sticking to rails file and modules naming convention
3
+ module Vcs
4
+ def self.guess
5
+ if File.exists?(File.join(Rails.root,'.git'))
6
+ return :git
7
+ end
8
+ false
9
+ end
10
+
11
+ def self.revision
12
+ case ErrorLog.options[:vcs]
13
+ when :git
14
+ git_root = File.join(Rails.root,'.git')
15
+ head = File.read("#{git_root}/HEAD")
16
+ ref = head.strip.split("ref:",2).last.strip
17
+ hash = File.read("#{git_root}/#{ref}").strip
18
+ else
19
+ ''
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,3 @@
1
1
  module ErrorLog
2
- VERSION = "0.0.5" unless defined?(::ErrorLog::VERSION)
2
+ VERSION = "0.0.6" unless defined?(::ErrorLog::VERSION)
3
3
  end
data/lib/error_log.rb CHANGED
@@ -1,5 +1,12 @@
1
1
  require 'pp'
2
2
 
3
+
4
+ # Everything you find directly in this module is skel from bones
5
+ # Some really useful methods as for lib, but you probably are not
6
+ # interested in any of them
7
+ #
8
+ # If you want to take a look at methods that you call directly on
9
+ # ErrorLog module, like ErrorLog.log, take a look at class_methods.rb
3
10
  module ErrorLog
4
11
 
5
12
  # :stopdoc:
@@ -60,37 +67,10 @@ module ErrorLog
60
67
  Dir.glob(search_me).sort.each {|rb| require rb}
61
68
  end
62
69
 
63
-
64
- def self.log(level,error,options={})
65
- backtrace = options[:backtrace]
66
- unless backtrace
67
- # get current backtrace, I'm happy to learn any more clever way
68
- begin
69
- raise "wat?!"
70
- rescue Exception => e
71
- backtrace = e.backtrace[1..-1]
72
- end
73
- end
74
-
75
- #TODO: silent rescues may not be optimal, for now they seem better than creating more mess
76
- logger.error "\n\n\n#{Time.now}\n= #{error}\n#{backtrace.join("\n")}\n#{options[:params]}" rescue nil
77
-
78
- ErrorLog::Model.create(
79
- :error => error,
80
- :backtrace => backtrace,
81
- :level => level,
82
- :params => options[:params],
83
- :category => options[:category] || 'error_log'
84
- ) rescue nil
85
- end
86
-
87
- def self.logger
88
- @logger = Logger.new(File.join(Rails.root,'log','error.log'))
89
- end
90
-
91
70
  end # module ErrorLog
92
71
 
93
72
 
94
73
  ActiveSupport.on_load(:before_initialize) do
95
74
  ErrorLog.require_all_libs_relative_to(__FILE__)
75
+ ErrorLog.init
96
76
  end
@@ -21,14 +21,29 @@
21
21
  %table#error_logs_wrap
22
22
  %tr
23
23
  %td{:valign=>"top"}
24
+
25
+ - all_count = @category_counts.values.sum
24
26
  %b Categories:
25
27
  %ul
26
28
  %li
27
- = link_to_if @errors_category, 'all', :action => :index
28
- (#{@category_counts.values.sum})
29
+ = link_to_if @opts[:category], 'all', :action => :index, :category => '-none-'
30
+ (#{all_count})
29
31
  - @category_counts.each_pair do |category,count|
30
32
  %li
31
- #{link_to_if (@errors_category != category), category, :action => :index, :category => category}&nbsp;(#{count})
33
+ #{link_to_if (@opts[:category] != category), category, :action => :index, :category => category}&nbsp;(#{count})
34
+
35
+ - if @revisions.count > 1
36
+ %b Revisions:
37
+ %ul
38
+ %li
39
+ = link_to_if @opts[:revision], 'all', :action => :index, :revision => '-none-'
40
+ (#{all_count})
41
+ - @revisions.each do |rev|
42
+ %li{:style => 'white-space: nowrap'}
43
+ - name = rev.created_at_first.to_date.to_s + '&nbsp;'
44
+ - name += (rev.vcs_revision.to_s.empty? ? 'unknown' : truncate(rev.vcs_revision,:length => 9))
45
+
46
+ #{link_to_if (@opts[:revision] != rev.vcs_revision.to_s), raw(name), :action => :index, :revision => rev.vcs_revision.to_s}&nbsp;(#{rev.count_all})
32
47
  %br
33
48
  %br
34
49
  %br
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: error_log
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 5
10
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kacper Ciesla
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-17 00:00:00 +01:00
18
+ date: 2010-11-20 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -47,11 +47,16 @@ files:
47
47
  - lib/error_log/model.rb
48
48
  - lib/error_log/controller.rb
49
49
  - lib/error_log/core_ext.rb
50
+ - lib/error_log/class_methods.rb
50
51
  - lib/error_log/migrations.rb
52
+ - lib/error_log/migrations/base.rb
53
+ - lib/error_log/migrations/add_params_column.rb
54
+ - lib/error_log/migrations/add_vcs_revision_column.rb
55
+ - lib/error_log/vcs.rb
51
56
  - views/index.html.haml
52
57
  - views/_styles.html.erb
53
58
  - views/_error_log.html.haml
54
- - README.txt
59
+ - README.rdoc
55
60
  - Changelog.txt
56
61
  has_rdoc: true
57
62
  homepage: