logster 0.0.13 → 0.1.0
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.
- checksums.yaml +4 -4
- data/assets/javascript/components/message-info.handlebars +7 -13
- data/assets/javascript/components/tab-contents.handlebars +10 -0
- data/assets/javascript/templates/index.handlebars +1 -1
- data/lib/examples/sidekiq_logster_reporter.rb +21 -0
- data/lib/logster/message.rb +7 -0
- data/lib/logster/middleware/viewer.rb +4 -0
- data/lib/logster/redis_store.rb +15 -1
- data/lib/logster/version.rb +1 -1
- data/test/examples/test_sidekiq_reporter_example.rb +31 -0
- data/test/logster/test_logger.rb +0 -2
- data/test/logster/test_redis_store.rb +21 -12
- data/test/test_helper.rb +23 -2
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cfda323f9ee2749181b885b462d4e6b6398f03b
|
4
|
+
data.tar.gz: d9cf1b6ce77e9c7d74745c253047d39c992a1855
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bef73cfac1f6232793744b1fcb1807da74088a271bba04b0ad7ad6bca95de46a9d39ed73e23371970afd0c7e045a93c8d538c056b4434fddbed44946fb37064f
|
7
|
+
data.tar.gz: 8bcab70e33821609e020ad951e2453394eafbe2fb11607d3cdb63563898656e0b48aa8227b1edb97e0eef471ef09f4f93a6c802db745676bffd714d7ca6eb2ac
|
@@ -1,21 +1,15 @@
|
|
1
1
|
<div class="message-info">
|
2
2
|
{{#tabbed-section}}
|
3
|
-
{{#tab-contents name="info" hint="show info"}}
|
3
|
+
{{#tab-contents name="info" hint="show info" currentMessage=currentMessage}}
|
4
4
|
<pre>{{currentMessage.message}}</pre>
|
5
|
-
{{#if currentMessage}}
|
6
|
-
<a {{bind-attr href=currentMessage.shareUrl}} class="share">Share</a>
|
7
|
-
<a {{bind-attr href=currentMessage.protectUrl}} class="save">
|
8
|
-
{{#if currentMessage.protected}}
|
9
|
-
Unprotect
|
10
|
-
{{else}}
|
11
|
-
Protect
|
12
|
-
{{/if}}
|
13
|
-
</a>
|
14
|
-
{{/if}}
|
15
5
|
{{/tab-contents}}
|
16
|
-
{{#tab-contents name="backtrace" hint="show backtrace"
|
6
|
+
{{#tab-contents name="backtrace" hint="show backtrace" currentMessage=currentMessage}}
|
7
|
+
<pre>{{currentMessage.backtrace}}</pre>
|
8
|
+
{{/tab-contents}}
|
17
9
|
{{#if currentMessage.env}}
|
18
|
-
{{#tab-contents name="env" hint="show environment"
|
10
|
+
{{#tab-contents name="env" hint="show environment" currentMessage=currentMessage}}
|
11
|
+
<pre>{{currentMessage.envDebug}}</pre>
|
12
|
+
{{/tab-contents}}
|
19
13
|
{{/if}}
|
20
14
|
{{/tabbed-section}}
|
21
15
|
</div>
|
@@ -1 +1,11 @@
|
|
1
1
|
{{yield}}
|
2
|
+
{{#if currentMessage}}
|
3
|
+
<a {{bind-attr href=currentMessage.shareUrl}} class="share">Share</a>
|
4
|
+
<a {{bind-attr href=currentMessage.protectUrl}} class="save">
|
5
|
+
{{#if currentMessage.protected}}
|
6
|
+
Unprotect
|
7
|
+
{{else}}
|
8
|
+
Protect
|
9
|
+
{{/if}}
|
10
|
+
</a>
|
11
|
+
{{/if}}
|
@@ -10,7 +10,7 @@
|
|
10
10
|
<tbody>
|
11
11
|
{{#if model.moreBefore}}
|
12
12
|
<tr {{action showMoreBefore}} class="show-more">
|
13
|
-
<td colspan=
|
13
|
+
<td colspan=3>{{model.totalBefore}} more</td>
|
14
14
|
</tr>
|
15
15
|
{{/if}}
|
16
16
|
{{each model.messages itemViewClass="App.MessageView"}}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class SidekiqLogsterReporter
|
2
|
+
def call(ex, context={})
|
3
|
+
# Pass context to Logster
|
4
|
+
fake_env = {}
|
5
|
+
context.each do |key, value|
|
6
|
+
Logster.add_to_env(fake_env, key, value)
|
7
|
+
end
|
8
|
+
|
9
|
+
text = "Job exception: #{ex}\n"
|
10
|
+
if ex.backtrace
|
11
|
+
Logster.add_to_env(fake_env, :backtrace, ex.backtrace)
|
12
|
+
end
|
13
|
+
|
14
|
+
Thread.current[Logster::Logger::LOGSTER_ENV] = fake_env
|
15
|
+
Logster.logger.error(text)
|
16
|
+
rescue => e
|
17
|
+
Logster.logger.fatal("Failed to log exception #{ex} #{hash}\nReason: #{e.class} #{e}\n#{e.backtrace.join("\n")}")
|
18
|
+
ensure
|
19
|
+
Thread.current[Logster::Logger::LOGSTER_ENV] = nil
|
20
|
+
end
|
21
|
+
end
|
data/lib/logster/message.rb
CHANGED
@@ -39,8 +39,10 @@ module Logster
|
|
39
39
|
# accl redirect is going to be trouble, ensure its bypassed
|
40
40
|
env['sendfile.type'] = ''
|
41
41
|
@fileserver.call(env)
|
42
|
+
|
42
43
|
elsif resource.start_with?("/messages.json")
|
43
44
|
serve_messages(Rack::Request.new(env))
|
45
|
+
|
44
46
|
elsif resource =~ /\/(un)?protect\/([0-9a-f]+)$/
|
45
47
|
off = $1 == "un"
|
46
48
|
key = $2
|
@@ -88,8 +90,10 @@ module Logster
|
|
88
90
|
preload = preload_json({"/show/#{key}.json" => message})
|
89
91
|
[200, {"Content-Type" => "text/html; charset=utf-8"}, [body(preload)]]
|
90
92
|
end
|
93
|
+
|
91
94
|
elsif resource == "/"
|
92
95
|
[200, {"Content-Type" => "text/html; charset=utf-8"}, [body(preload_json)]]
|
96
|
+
|
93
97
|
else
|
94
98
|
[404, {}, ["Not found"]]
|
95
99
|
end
|
data/lib/logster/redis_store.rb
CHANGED
@@ -21,7 +21,7 @@ module Logster
|
|
21
21
|
return if level && severity < level
|
22
22
|
return if @ignore && @ignore.any?{|pattern| message =~ pattern}
|
23
23
|
|
24
|
-
message = Logster::Message.new(severity, progname, message)
|
24
|
+
message = Logster::Message.new(severity, progname, message, (opts && opts[:timestamp]))
|
25
25
|
|
26
26
|
if opts && backtrace = opts[:backtrace]
|
27
27
|
message.backtrace = backtrace
|
@@ -109,9 +109,23 @@ module Logster
|
|
109
109
|
protected = @redis.mapped_hmget(hash_key, *keys)
|
110
110
|
@redis.del(hash_key)
|
111
111
|
@redis.mapped_hmset(hash_key, protected)
|
112
|
+
|
113
|
+
sorted = protected
|
114
|
+
.values
|
115
|
+
.map { |string| Message.from_json(string) }
|
116
|
+
.sort
|
117
|
+
.map(&:key)
|
118
|
+
|
119
|
+
@redis.pipelined do
|
120
|
+
sorted.each do |message_key|
|
121
|
+
@redis.rpush(list_key, message_key)
|
122
|
+
end
|
123
|
+
end
|
112
124
|
end
|
113
125
|
end
|
114
126
|
|
127
|
+
# Delete everything, included protected messages
|
128
|
+
# (use in tests)
|
115
129
|
def clear_all
|
116
130
|
@redis.del(list_key)
|
117
131
|
@redis.del(protected_key)
|
data/lib/logster/version.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
require 'logster/logger'
|
3
|
+
require 'logger'
|
4
|
+
require 'examples/sidekiq_logster_reporter'
|
5
|
+
|
6
|
+
class TestSidekiqReporter < MiniTest::Test
|
7
|
+
|
8
|
+
def setup
|
9
|
+
Logster.store = @store = Logster::TestStore.new
|
10
|
+
Logster.logger = @logger = Logster::Logger.new(Logster.store)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_sidekiq_handler_example
|
14
|
+
handler = SidekiqLogsterReporter.new
|
15
|
+
error = nil
|
16
|
+
begin
|
17
|
+
raise TypeError.new
|
18
|
+
rescue => e
|
19
|
+
error = e
|
20
|
+
end
|
21
|
+
|
22
|
+
handler.call(error, code: "Test", something_important: "Foo", params: { article_id: 20 })
|
23
|
+
|
24
|
+
error = Logster.store.reported[0]
|
25
|
+
|
26
|
+
assert(error.backtrace != nil)
|
27
|
+
assert_equal("Job exception: TypeError\n", error.message)
|
28
|
+
assert_equal("Test", error.env[:code])
|
29
|
+
assert_equal(20, error.env[:params][:article_id])
|
30
|
+
end
|
31
|
+
end
|
data/test/logster/test_logger.rb
CHANGED
@@ -10,7 +10,7 @@ class TestRedisStore < Minitest::Test
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def teardown
|
13
|
-
@store.
|
13
|
+
@store.clear_all
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_latest
|
@@ -121,26 +121,35 @@ class TestRedisStore < Minitest::Test
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def test_clear
|
124
|
-
|
125
|
-
|
124
|
+
@store.max_backlog = 25
|
125
|
+
a_message = @store.report(Logger::WARN, "test", "A", timestamp: Time.now - (24*60*60))
|
126
|
+
@store.protect a_message.key
|
127
|
+
20.times do
|
128
|
+
@store.report(Logger::WARN, "test", "B")
|
126
129
|
end
|
127
|
-
|
128
|
-
|
129
|
-
@store.
|
130
|
-
c_message = @store.report(Logger::WARN, "test", "C")
|
130
|
+
c_message = @store.report(Logger::WARN, "test", "C", timestamp: Time.now + (24*60*60))
|
131
|
+
@store.protect c_message.key
|
132
|
+
d_message = @store.report(Logger::WARN, "test", "D")
|
131
133
|
10.times do
|
132
|
-
@store.report(Logger::WARN, "test", "
|
134
|
+
@store.report(Logger::WARN, "test", "E")
|
133
135
|
end
|
134
136
|
|
135
137
|
latest = @store.latest
|
136
|
-
assert_equal(
|
138
|
+
assert_equal(25, latest.length)
|
137
139
|
|
138
140
|
@store.clear
|
139
141
|
|
142
|
+
# Protected messages are still accessible by their key
|
143
|
+
assert_equal("C", @store.get(c_message.key).message)
|
144
|
+
# Unprotected messages are gone
|
145
|
+
assert_nil(@store.get(d_message.key))
|
146
|
+
|
147
|
+
# The latest list is rebuilt with protected messages, earliest first
|
148
|
+
# Including messages that previously fell off (A)
|
140
149
|
latest = @store.latest
|
141
|
-
assert_equal(
|
142
|
-
assert_equal("
|
143
|
-
|
150
|
+
assert_equal(2, latest.length)
|
151
|
+
assert_equal("A", latest[0].message)
|
152
|
+
assert_equal("C", latest[1].message)
|
144
153
|
end
|
145
154
|
|
146
155
|
def test_hash_cleanup
|
data/test/test_helper.rb
CHANGED
@@ -12,7 +12,28 @@ class Logster::TestStore
|
|
12
12
|
@reported = []
|
13
13
|
end
|
14
14
|
|
15
|
-
def report(
|
16
|
-
|
15
|
+
def report(severity, progname, message, opts = nil)
|
16
|
+
opts ||= {}
|
17
|
+
env = opts[:env]
|
18
|
+
backtrace = opts[:backtrace]
|
19
|
+
if env && !backtrace
|
20
|
+
backtrace = env[:backtrace]
|
21
|
+
end
|
22
|
+
|
23
|
+
message = Logster::Message.new(severity, progname, message)
|
24
|
+
|
25
|
+
if backtrace
|
26
|
+
message.backtrace = backtrace
|
27
|
+
else
|
28
|
+
message.backtrace = caller.join("\n")
|
29
|
+
end
|
30
|
+
|
31
|
+
if env
|
32
|
+
message.populate_from_env(env)
|
33
|
+
end
|
34
|
+
|
35
|
+
@reported << message
|
36
|
+
|
37
|
+
message
|
17
38
|
end
|
18
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- UI for viewing logs in Rack
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -124,6 +124,7 @@ files:
|
|
124
124
|
- assets/javascript/templates/show.handlebars
|
125
125
|
- assets/stylesheets/app.css
|
126
126
|
- bower.json
|
127
|
+
- lib/examples/sidekiq_logster_reporter.rb
|
127
128
|
- lib/logster.rb
|
128
129
|
- lib/logster/configuration.rb
|
129
130
|
- lib/logster/logger.rb
|
@@ -136,6 +137,7 @@ files:
|
|
136
137
|
- lib/logster/version.rb
|
137
138
|
- lib/logster/web.rb
|
138
139
|
- logster.gemspec
|
140
|
+
- test/examples/test_sidekiq_reporter_example.rb
|
139
141
|
- test/logster/middleware/test_reporter.rb
|
140
142
|
- test/logster/middleware/test_viewer.rb
|
141
143
|
- test/logster/test_logger.rb
|
@@ -167,6 +169,7 @@ signing_key:
|
|
167
169
|
specification_version: 4
|
168
170
|
summary: UI for viewing logs in Rack
|
169
171
|
test_files:
|
172
|
+
- test/examples/test_sidekiq_reporter_example.rb
|
170
173
|
- test/logster/middleware/test_reporter.rb
|
171
174
|
- test/logster/middleware/test_viewer.rb
|
172
175
|
- test/logster/test_logger.rb
|