log_jam 0.0.1

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.
Files changed (4) hide show
  1. data/log_jam.rb +59 -0
  2. data/log_jam_test.rb +53 -0
  3. data/readme.md +10 -0
  4. metadata +58 -0
data/log_jam.rb ADDED
@@ -0,0 +1,59 @@
1
+ module LogJam
2
+ extend self
3
+
4
+ @@logs = []
5
+
6
+ def priorities(*list)
7
+ @@priorities = list
8
+ end
9
+
10
+ def puts(msg)
11
+ @@logs << msg
12
+ Rails.logger.info(msg)
13
+ end
14
+
15
+ def write_to_disk
16
+ logs = drain
17
+ @@priorities.select {|p| logs.keys.include?(p) }.map do |filter|
18
+ logs[filter].each do |log|
19
+ klass = Kernel.const_get(camelize(filter.to_s + "_log"))
20
+ klass.create("#{filter}_id" => grep_id(filter, log), :message => log)
21
+ end
22
+ end.all?
23
+ end
24
+
25
+ def drain
26
+ result = {}
27
+ until @@logs.empty? do
28
+ log = @@logs.pop
29
+ @@priorities.each do |filter|
30
+ if filtered_id = grep_id(filter.to_s, log)
31
+ result[filter] ||= []
32
+ result[filter] << log
33
+ break
34
+ end
35
+ end
36
+ end
37
+ result
38
+ end
39
+
40
+ def grep_id(term, string)
41
+ if match = string.match(/#{term}=?(\d*)/)
42
+ id = match.captures[0]
43
+ if id.respond_to?(:to_i)
44
+ id.to_i
45
+ else
46
+ raise "LogJam Error: expected #{term}=#{id} to contain an integer"
47
+ end
48
+ end
49
+ end
50
+
51
+ def camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
52
+ if first_letter_in_uppercase
53
+ lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
54
+ else
55
+ lower_case_and_underscored_word.to_s[0].chr.downcase + camelize(lower_case_and_underscored_word)[1..-1]
56
+ end
57
+ end
58
+
59
+ end
data/log_jam_test.rb ADDED
@@ -0,0 +1,53 @@
1
+ $:.unshift(".")
2
+ require 'log_jam.rb'
3
+ require 'minitest/autorun'
4
+
5
+ class Rails
6
+ def self.logger
7
+ def self.info(str)
8
+ puts str
9
+ end
10
+ self
11
+ end
12
+ end
13
+
14
+ class Log
15
+ def self.create(*args)
16
+ true
17
+ end
18
+ end
19
+ class AccountLog < Log; end
20
+ class InvoiceLog < Log; end
21
+
22
+ class LogJamTest < MiniTest::Unit::TestCase
23
+
24
+ def test_write_to_disk
25
+ log_msg = "invoice=123 account=123"
26
+ LogJam.priorities(:invoice, :account)
27
+ LogJam.puts(log_msg)
28
+ assert LogJam.write_to_disk
29
+ end
30
+
31
+ def test_write_to_disk_fails_when_storage_not_defined
32
+ log_msg = "line_items=123 invoice=123 account=123"
33
+ LogJam.priorities(:line_item, :invoice, :account)
34
+ LogJam.puts(log_msg)
35
+ assert_raises(NameError) { LogJam.write_to_disk }
36
+ end
37
+
38
+ def test_drain_with_priority
39
+ log_msg = "invoice=123 account=123"
40
+ LogJam.priorities(:invoice, :account)
41
+ LogJam.puts(log_msg)
42
+ assert_equal({:invoice => [log_msg]}, LogJam.drain)
43
+ end
44
+
45
+ def test_drain_with_priority_when_first_priority_not_present
46
+ log_msg = "line_item=123 account=123"
47
+ LogJam.priorities(:invoice, :account)
48
+ LogJam.puts(log_msg)
49
+ assert_equal({:account => [log_msg]}, LogJam.drain)
50
+ end
51
+
52
+
53
+ end
data/readme.md ADDED
@@ -0,0 +1,10 @@
1
+ # LogJam
2
+
3
+ A proxy that persists log messages to a database.
4
+
5
+ ## Usage
6
+
7
+ ```ruby
8
+ LogJam.puts("account=123 invoice=456 invoice created")
9
+ LogJam.puts("account=123 page=true core services off-line")
10
+ ```
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: log_jam
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Ryan Smith
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-08-15 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: LogJam is a proxy to another logger. Say, the Rails logger. This gem intercepts the log message and writes them to a database every now and then.
18
+ email: ryan@heroku.com
19
+ executables: []
20
+
21
+ extensions: []
22
+
23
+ extra_rdoc_files: []
24
+
25
+ files:
26
+ - readme.md
27
+ - log_jam.rb
28
+ - log_jam_test.rb
29
+ has_rdoc: true
30
+ homepage: http://ryandotsmith.heroku.com
31
+ licenses: []
32
+
33
+ post_install_message:
34
+ rdoc_options: []
35
+
36
+ require_paths:
37
+ - .
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ requirements: []
51
+
52
+ rubyforge_project:
53
+ rubygems_version: 1.6.2
54
+ signing_key:
55
+ specification_version: 3
56
+ summary: logging utility
57
+ test_files:
58
+ - log_jam_test.rb