logster 0.8.4.8.pre → 0.9.9
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/README.md +87 -59
- data/assets/images/logster-apple-touch.png +0 -0
- data/assets/images/logster-favicon.png +0 -0
- data/assets/images/logster-logo.png +0 -0
- data/assets/images/logster-logo.psd +0 -0
- data/assets/images/logster-screenshot.png +0 -0
- data/assets/javascript/app.js +18 -2
- data/lib/logster/message.rb +7 -3
- data/lib/logster/redis_store.rb +9 -5
- data/lib/logster/version.rb +1 -1
- data/test/fake_data/Gemfile +4 -0
- data/test/fake_data/generate.rb +10 -0
- data/test/logster/test_redis_store.rb +18 -0
- metadata +13 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1b6667903d7ea941ef28292bc3e3344e399e1b35
|
|
4
|
+
data.tar.gz: 024bdf71269ded5bfe341455d5451d0357631796
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 08fae884b5a23abd1291f42e4d05e1ceecdbab9a5d0ab5049c3a4ca88ee18488497f3be6fe7f26bae672f66b1fa1eb94d35dd065107105c08f1305e379c03aab
|
|
7
|
+
data.tar.gz: e0224e2901ff506330d5fe547ae8c2206ceccc52e1d9a15ee1c593368cfc36fc7b7ac6892747bb83dc9a938fa9b2c6e3d03d107202f03f7cb604649c89b8e53c
|
data/README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+

|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Logster is an embedded Ruby "exception reporting service" admins can view on live websites, at `http://example.com/logs`
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Interface
|
|
6
6
|
|
|
7
|
-

|
|
8
|
+
|
|
9
|
+
Play with a live demo at [logster.info/logs](http://logster.info/logs).
|
|
8
10
|
|
|
9
11
|
## Installation
|
|
10
12
|
|
|
@@ -34,13 +36,12 @@ Logster.set_environments([:development, :staging, :production])
|
|
|
34
36
|
```
|
|
35
37
|
|
|
36
38
|
### Note
|
|
37
|
-
If you are seeing error
|
|
38
|
-
|
|
39
|
-
then you are using a conflicting gem like better_errors.
|
|
39
|
+
If you are seeing the error `No such middleware to insert before: ActionDispatch::DebugExceptions` after installing logster,
|
|
40
|
+
then you are using a conflicting gem like `better_errors`.
|
|
40
41
|
|
|
41
42
|
To avoid this error, make sure logster is added behind those conflicting gems in your Gemfile.
|
|
42
43
|
|
|
43
|
-
###
|
|
44
|
+
### Mount using warden (devise)
|
|
44
45
|
```
|
|
45
46
|
admin_constraint = lambda do |request|
|
|
46
47
|
request.env['warden'].authenticate? and request.env['warden'].user.admin?
|
|
@@ -57,13 +58,6 @@ Out of the box, logster will use the default redis connection, to customise, in
|
|
|
57
58
|
Logster.store = Logster::RedisStore.new(redis_connection)
|
|
58
59
|
```
|
|
59
60
|
|
|
60
|
-
## Usage
|
|
61
|
-
|
|
62
|
-
The concept is to have an embedded "exception reporting service" admins can view on live sites.
|
|
63
|
-
|
|
64
|
-
Logs will be visible by default at `http://sitename.com/logs`
|
|
65
|
-
|
|
66
|
-
|
|
67
61
|
## Thanks
|
|
68
62
|
|
|
69
63
|
Logster UI is built using [Ember.js](http://emberjs.com/)
|
|
@@ -78,53 +72,87 @@ Logster UI is built using [Ember.js](http://emberjs.com/)
|
|
|
78
72
|
|
|
79
73
|
# CHANGELOG
|
|
80
74
|
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
- Feature:
|
|
84
|
-
- Feature:
|
|
85
|
-
-
|
|
86
|
-
- Feature:
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
-
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
- Add
|
|
103
|
-
|
|
75
|
+
- 2015-08-18: Version 0.9.9
|
|
76
|
+
- This marks the largest release of Logster to date, it has been in production use for quite a while, hence the version bump.
|
|
77
|
+
- Feature: automatically group errors in production mode, can be manually controlled via Logster.config.allow_grouping
|
|
78
|
+
- Feature: automatically track application version, can be manually controlled via Logster.config.application_version
|
|
79
|
+
- Feature: Font Awesome icons used throughout
|
|
80
|
+
- Feature: Ember upgrade to 1.13
|
|
81
|
+
- Feature: you can now "solve" a class of errors, if error has an application_version and backtrace. Once an error is solved it will no longer be reported for the "solved" application_versions
|
|
82
|
+
- Feature: allow users to delete a single error
|
|
83
|
+
- UX: use table for env
|
|
84
|
+
- Feature: display "protected" state of message in list
|
|
85
|
+
- Feature: use local times as opposed to relative times in time column
|
|
86
|
+
- UX: use Google Roboto font as opposed to system fonts
|
|
87
|
+
- UX: remove pointless titles from log table
|
|
88
|
+
- Feature: If Logster is in a background tab only poll once every 60 seconds (as opposed to 3)
|
|
89
|
+
- Fix: protect/unprotect redirected to show page
|
|
90
|
+
|
|
91
|
+
- 2015-06-16: Version 0.8.3
|
|
92
|
+
- Chained loggers now respect chain ignore
|
|
93
|
+
- Add hostname and process_id to env on all messages
|
|
94
|
+
|
|
95
|
+
- 2015-06-10: Version 0.8.2
|
|
96
|
+
- Add hostname and process_id to env on all messages
|
|
97
|
+
|
|
98
|
+
- 2015-05-01: Version 0.8.1
|
|
99
|
+
- Don't crash out logging routine if redis is down or stderr is closed
|
|
100
|
+
|
|
101
|
+
- 2015-04-16: Version 0.8.0
|
|
102
|
+
- Improve formatting of /show page
|
|
103
|
+
- Big version bump cause it is quite stable
|
|
104
|
+
|
|
105
|
+
- 2015-02-27: Version 0.1.7
|
|
106
|
+
- Fix invalid request on ?test
|
|
107
|
+
|
|
108
|
+
- 2014-08-05: Version 0.1.3
|
|
109
|
+
- Automatically include ignore filter
|
|
110
|
+
|
|
111
|
+
- 2014-08-13: Version 0.1.6
|
|
112
|
+
- Simplify install process
|
|
113
|
+
- Fix crash on 404 in /logs dir
|
|
114
|
+
|
|
115
|
+
- 2014-08-10: Version 0.1.5
|
|
116
|
+
- Fix crash in Rails 3
|
|
117
|
+
|
|
118
|
+
- 2014-08-08: Version 0.1.4
|
|
119
|
+
- Fix crash in ignore filter
|
|
120
|
+
|
|
104
121
|
- 2014-07-17: Version 0.1.1
|
|
105
122
|
- Refactored report method into base_store.rb - will be easier to make a new log store
|
|
106
123
|
- Add link in UI to clear all (non-protected) logs
|
|
107
124
|
- Add example of submitting logs from Sidekiq jobs
|
|
108
125
|
- Show Protect/Share links on all tabs
|
|
109
126
|
- Render hashes provided via Logster.add_to_env
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
-
|
|
113
|
-
-
|
|
114
|
-
-
|
|
115
|
-
|
|
116
|
-
- 2014-
|
|
117
|
-
-
|
|
118
|
-
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
-
|
|
125
|
-
|
|
126
|
-
-
|
|
127
|
-
- Add
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
- Add
|
|
127
|
+
|
|
128
|
+
- 2014-07-04: Version 0.0.12
|
|
129
|
+
- Feature: Able to share logs, at /logs/show/(hexdigits)
|
|
130
|
+
- Add protecting logs, so they aren't deleted when old (for use with sharing)
|
|
131
|
+
- Restructured Redis data model
|
|
132
|
+
|
|
133
|
+
- 2014-05-24: Version 0.0.10
|
|
134
|
+
- Correct context for error reporting
|
|
135
|
+
- Clean up backtraces of reported exceptions
|
|
136
|
+
|
|
137
|
+
- 2014-05-13: Version 0.0.9
|
|
138
|
+
- Stray debugger message removed, add window.location logging to js
|
|
139
|
+
|
|
140
|
+
- 2014-05-13: Version 0.0.8
|
|
141
|
+
- Fix pacakging binstubs by mistake
|
|
142
|
+
|
|
143
|
+
- 2014-05-13: Version 0.0.7
|
|
144
|
+
- Add support for javascript exception logging
|
|
145
|
+
|
|
146
|
+
- 2014-05-12: Version 0.0.6
|
|
147
|
+
- Add referer to env
|
|
148
|
+
|
|
149
|
+
- 2014-05-12: Version 0.0.5
|
|
150
|
+
- Feature: We now log basic rack environment with the messages
|
|
151
|
+
- Add your own with Logster.add_to_env(env, key, value)
|
|
152
|
+
|
|
153
|
+
- 2014-05-07: Version 0.0.4
|
|
154
|
+
- Feature: Ability to ignore patterns with Logster.store.ignore = [/regex/]
|
|
155
|
+
- Feature: Store backtraces, allow people to view them in the GUI
|
|
156
|
+
|
|
157
|
+
- 2014-05-07: Started changelog :)
|
|
158
|
+
- Report params in env tab
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
data/assets/javascript/app.js
CHANGED
|
@@ -50,6 +50,21 @@ App.Router.map(function() {
|
|
|
50
50
|
this.route("show", { path: "/show/:id" });
|
|
51
51
|
});
|
|
52
52
|
|
|
53
|
+
var entityMap = {
|
|
54
|
+
"&": "&",
|
|
55
|
+
"<": "<",
|
|
56
|
+
">": ">",
|
|
57
|
+
'"': '"',
|
|
58
|
+
"'": ''',
|
|
59
|
+
"/": '/'
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
function escapeHtml(string) {
|
|
63
|
+
return String(string).replace(/[&<>"'\/]/g, function (s) {
|
|
64
|
+
return entityMap[s];
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
53
68
|
function buildArrayString(array) {
|
|
54
69
|
var buffer = [];
|
|
55
70
|
_.each(array, function(v) {
|
|
@@ -58,7 +73,7 @@ function buildArrayString(array) {
|
|
|
58
73
|
} else if (Object.prototype.toString.call(v) === '[object Array]') {
|
|
59
74
|
buffer.push(buildArrayString(v));
|
|
60
75
|
} else {
|
|
61
|
-
buffer.push(
|
|
76
|
+
buffer.push(escapeHtml(v.toString()));
|
|
62
77
|
}
|
|
63
78
|
});
|
|
64
79
|
return '[' + buffer.join(', ') + ']';
|
|
@@ -70,10 +85,11 @@ function buildHashString(hash, recurse) {
|
|
|
70
85
|
var buffer = [],
|
|
71
86
|
hashes = [];
|
|
72
87
|
_.each(hash, function(v, k) {
|
|
88
|
+
|
|
73
89
|
if (v === null) {
|
|
74
90
|
buffer.push('null');
|
|
75
91
|
} else if (Object.prototype.toString.call(v) === '[object Array]') {
|
|
76
|
-
buffer.push("<tr><td>" +
|
|
92
|
+
buffer.push("<tr><td>" + escapeHtml(k) + "</td><td>" + buildArrayString(v) + "</td></tr>");
|
|
77
93
|
} else if (typeof v === "object") {
|
|
78
94
|
hashes.push(k);
|
|
79
95
|
} else {
|
data/lib/logster/message.rb
CHANGED
|
@@ -101,10 +101,14 @@ module Logster
|
|
|
101
101
|
end
|
|
102
102
|
|
|
103
103
|
# todo - memoize?
|
|
104
|
-
def
|
|
105
|
-
if (
|
|
104
|
+
def solved_keys
|
|
105
|
+
if (versions=env["application_version"]) &&
|
|
106
106
|
(backtrace && backtrace.length > 0)
|
|
107
|
-
|
|
107
|
+
versions = [versions] if String === versions
|
|
108
|
+
|
|
109
|
+
versions.map do |version|
|
|
110
|
+
Digest::SHA1.hexdigest "#{version} #{backtrace}"
|
|
111
|
+
end
|
|
108
112
|
end
|
|
109
113
|
end
|
|
110
114
|
|
data/lib/logster/redis_store.rb
CHANGED
|
@@ -14,8 +14,10 @@ module Logster
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
def save(message)
|
|
17
|
-
if
|
|
18
|
-
|
|
17
|
+
if keys=message.solved_keys
|
|
18
|
+
keys.each do |solved|
|
|
19
|
+
return true if @redis.hget(solved_key, solved)
|
|
20
|
+
end
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
@redis.multi do
|
|
@@ -60,9 +62,11 @@ module Logster
|
|
|
60
62
|
end
|
|
61
63
|
|
|
62
64
|
def solve(message_key)
|
|
63
|
-
if (message = get(message_key)) && (
|
|
65
|
+
if (message = get(message_key)) && (keys = message.solved_keys)
|
|
64
66
|
# add a time so we can expire it
|
|
65
|
-
|
|
67
|
+
keys.each do |s_key|
|
|
68
|
+
@redis.hset(solved_key, s_key, Time.now.to_f.to_i)
|
|
69
|
+
end
|
|
66
70
|
end
|
|
67
71
|
clear_solved
|
|
68
72
|
end
|
|
@@ -187,7 +191,7 @@ module Logster
|
|
|
187
191
|
|
|
188
192
|
@redis.hmget(hash_key, message_keys).each do |json|
|
|
189
193
|
message = Message.from_json(json)
|
|
190
|
-
|
|
194
|
+
unless (ignores & message.solved_keys).empty?
|
|
191
195
|
delete message
|
|
192
196
|
end
|
|
193
197
|
end
|
data/lib/logster/version.rb
CHANGED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
require 'redis'
|
|
2
|
+
require 'logster'
|
|
3
|
+
|
|
4
|
+
Logster.config.allow_grouping = true
|
|
5
|
+
Logster.config.application_version = "ABC123"
|
|
6
|
+
Logster.store = Logster::RedisStore.new
|
|
7
|
+
|
|
8
|
+
10.times do
|
|
9
|
+
Logster.store.report(Logger::WARN, "application", "test warning", backtrace: "method1\nmethod2", env: {something: ["hello world", "hello places"], another: {thing: "something else"}})
|
|
10
|
+
end
|
|
@@ -257,6 +257,24 @@ class TestRedisStore < Minitest::Test
|
|
|
257
257
|
Logster.config.application_version = nil
|
|
258
258
|
end
|
|
259
259
|
|
|
260
|
+
def test_solve_grouped
|
|
261
|
+
Logster.config.allow_grouping = true
|
|
262
|
+
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz"})
|
|
263
|
+
m = @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "efg"})
|
|
264
|
+
|
|
265
|
+
assert_equal(1, @store.latest.count)
|
|
266
|
+
|
|
267
|
+
@store.solve(m.key)
|
|
268
|
+
|
|
269
|
+
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz"})
|
|
270
|
+
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "efg"})
|
|
271
|
+
|
|
272
|
+
assert_equal(0, @store.latest.count)
|
|
273
|
+
|
|
274
|
+
ensure
|
|
275
|
+
Logster.config.allow_grouping = false
|
|
276
|
+
end
|
|
277
|
+
|
|
260
278
|
def test_clears_solved
|
|
261
279
|
m = @store.report(Logger::WARN, "application", "test error2", backtrace: "backtrace1", env: {"application_version" => "abc"})
|
|
262
280
|
@store.solve(m.key)
|
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.
|
|
4
|
+
version: 0.9.9
|
|
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: 2015-08-
|
|
11
|
+
date: 2015-08-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -113,6 +113,11 @@ files:
|
|
|
113
113
|
- assets/fonts/fontawesome-webfont.ttf
|
|
114
114
|
- assets/fonts/fontawesome-webfont.woff
|
|
115
115
|
- assets/fonts/fontawesome-webfont.woff2
|
|
116
|
+
- assets/images/logster-apple-touch.png
|
|
117
|
+
- assets/images/logster-favicon.png
|
|
118
|
+
- assets/images/logster-logo.png
|
|
119
|
+
- assets/images/logster-logo.psd
|
|
120
|
+
- assets/images/logster-screenshot.png
|
|
116
121
|
- assets/javascript/app.js
|
|
117
122
|
- assets/javascript/components/message-info.hbs
|
|
118
123
|
- assets/javascript/components/message-row.hbs
|
|
@@ -148,6 +153,8 @@ files:
|
|
|
148
153
|
- lib/logster/web.rb
|
|
149
154
|
- logster.gemspec
|
|
150
155
|
- test/examples/test_sidekiq_reporter_example.rb
|
|
156
|
+
- test/fake_data/Gemfile
|
|
157
|
+
- test/fake_data/generate.rb
|
|
151
158
|
- test/logster/middleware/test_reporter.rb
|
|
152
159
|
- test/logster/middleware/test_viewer.rb
|
|
153
160
|
- test/logster/test_base_store.rb
|
|
@@ -172,9 +179,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
172
179
|
version: '0'
|
|
173
180
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
174
181
|
requirements:
|
|
175
|
-
- - "
|
|
182
|
+
- - ">="
|
|
176
183
|
- !ruby/object:Gem::Version
|
|
177
|
-
version:
|
|
184
|
+
version: '0'
|
|
178
185
|
requirements: []
|
|
179
186
|
rubyforge_project:
|
|
180
187
|
rubygems_version: 2.4.5
|
|
@@ -183,6 +190,8 @@ specification_version: 4
|
|
|
183
190
|
summary: UI for viewing logs in Rack
|
|
184
191
|
test_files:
|
|
185
192
|
- test/examples/test_sidekiq_reporter_example.rb
|
|
193
|
+
- test/fake_data/Gemfile
|
|
194
|
+
- test/fake_data/generate.rb
|
|
186
195
|
- test/logster/middleware/test_reporter.rb
|
|
187
196
|
- test/logster/middleware/test_viewer.rb
|
|
188
197
|
- test/logster/test_base_store.rb
|