logster 1.2.11 → 1.3.pre
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/.gitignore +18 -17
- data/.travis.yml +15 -16
- data/CHANGELOG.md +130 -130
- data/Gemfile +4 -4
- data/Guardfile +8 -8
- data/LICENSE.txt +22 -22
- data/README.md +99 -96
- data/Rakefile +24 -23
- data/assets/fonts/FontAwesome.otf +0 -0
- data/assets/fonts/fontawesome-webfont.eot +0 -0
- data/assets/fonts/fontawesome-webfont.svg +639 -639
- data/assets/fonts/fontawesome-webfont.ttf +0 -0
- data/assets/fonts/fontawesome-webfont.woff +0 -0
- data/assets/fonts/fontawesome-webfont.woff2 +0 -0
- data/assets/images/Icon-144_rounded.png +0 -0
- data/assets/images/Icon-144_square.png +0 -0
- data/assets/images/icon_144x144.png +0 -0
- data/assets/images/icon_64x64.png +0 -0
- data/assets/javascript/client-app.js +81 -0
- data/assets/javascript/vendor.js +5302 -0
- data/assets/stylesheets/client-app.css +1 -0
- data/assets/stylesheets/vendor.css +4 -0
- data/build_client_app.sh +12 -0
- data/client-app/.editorconfig +20 -0
- data/client-app/.ember-cli +9 -0
- data/client-app/.eslintignore +19 -0
- data/client-app/.eslintrc.js +46 -0
- data/client-app/.gitignore +23 -0
- data/client-app/.travis.yml +27 -0
- data/client-app/.watchmanconfig +3 -0
- data/client-app/README.md +57 -0
- data/client-app/app/app.js +14 -0
- data/client-app/app/components/message-info.js +18 -0
- data/client-app/app/components/message-row.js +45 -0
- data/client-app/app/components/panel-resizer.js +75 -0
- data/client-app/app/components/tab-contents.js +27 -0
- data/client-app/app/components/tab-link.js +5 -0
- data/client-app/app/components/tabbed-section.js +32 -0
- data/client-app/app/components/time-formatter.js +25 -0
- data/client-app/app/components/update-time.js +21 -0
- data/client-app/app/controllers/index.js +83 -0
- data/client-app/app/controllers/show.js +13 -0
- data/client-app/app/index.html +29 -0
- data/client-app/app/initializers/app-init.js +55 -0
- data/client-app/app/lib/preload.js +14 -0
- data/client-app/app/lib/utilities.js +140 -0
- data/client-app/app/models/message-collection.js +158 -0
- data/client-app/app/models/message.js +99 -0
- data/client-app/app/resolver.js +3 -0
- data/client-app/app/router.js +14 -0
- data/client-app/app/routes/index.js +53 -0
- data/client-app/app/routes/show.js +14 -0
- data/{assets/stylesheets → client-app/app/styles}/app.css +387 -390
- data/{assets/javascript → client-app/app}/templates/application.hbs +2 -2
- data/client-app/app/templates/components/message-info.hbs +44 -0
- data/{assets/javascript → client-app/app/templates}/components/message-row.hbs +17 -17
- data/client-app/app/templates/components/tabbed-section.hbs +10 -0
- data/client-app/app/templates/components/time-formatter.hbs +1 -0
- data/{assets/javascript → client-app/app}/templates/index.hbs +57 -57
- data/{assets/javascript → client-app/app}/templates/show.hbs +4 -4
- data/client-app/config/environment.js +51 -0
- data/client-app/config/optional-features.json +3 -0
- data/client-app/config/targets.js +18 -0
- data/client-app/ember-cli-build.js +29 -0
- data/client-app/package-lock.json +11365 -0
- data/client-app/package.json +56 -0
- data/client-app/testem.js +25 -0
- data/client-app/tests/index.html +34 -0
- data/client-app/tests/integration/components/message-info-test.js +26 -0
- data/client-app/tests/integration/components/message-row-test.js +26 -0
- data/client-app/tests/integration/components/panel-resizer-test.js +26 -0
- data/client-app/tests/integration/components/tab-contents-test.js +26 -0
- data/client-app/tests/integration/components/tab-link-test.js +26 -0
- data/client-app/tests/integration/components/tabbed-section-test.js +26 -0
- data/client-app/tests/integration/components/time-formatter-test.js +26 -0
- data/client-app/tests/integration/components/update-time-test.js +26 -0
- data/client-app/tests/test-helper.js +8 -0
- data/client-app/tests/unit/controllers/index-test.js +12 -0
- data/client-app/tests/unit/controllers/show-test.js +12 -0
- data/client-app/tests/unit/initializers/app-init-test.js +31 -0
- data/client-app/tests/unit/routes/index-test.js +11 -0
- data/client-app/tests/unit/routes/show-test.js +11 -0
- data/lib/examples/sidekiq_logster_reporter.rb +21 -21
- data/lib/logster.rb +54 -54
- data/lib/logster/base_store.rb +130 -130
- data/lib/logster/configuration.rb +25 -25
- data/lib/logster/ignore_pattern.rb +65 -65
- data/lib/logster/logger.rb +102 -101
- data/lib/logster/message.rb +227 -226
- data/lib/logster/middleware/debug_exceptions.rb +26 -26
- data/lib/logster/middleware/reporter.rb +56 -54
- data/lib/logster/middleware/viewer.rb +220 -251
- data/lib/logster/rails/railtie.rb +58 -58
- data/lib/logster/redis_store.rb +481 -477
- data/lib/logster/version.rb +3 -3
- data/lib/logster/web.rb +14 -14
- data/logster.gemspec +34 -33
- data/test/examples/test_sidekiq_reporter_example.rb +46 -46
- data/test/fake_data/Gemfile +4 -4
- data/test/fake_data/generate.rb +10 -10
- data/test/logster/middleware/test_reporter.rb +21 -21
- data/test/logster/middleware/test_viewer.rb +96 -70
- data/test/logster/test_base_store.rb +147 -147
- data/test/logster/test_ignore_pattern.rb +41 -41
- data/test/logster/test_logger.rb +74 -74
- data/test/logster/test_message.rb +34 -34
- data/test/logster/test_redis_rate_limiter.rb +230 -230
- data/test/logster/test_redis_store.rb +427 -414
- data/test/test_helper.rb +38 -37
- data/vendor/assets/javascripts/logster.js.erb +39 -39
- metadata +83 -24
- data/assets/javascript/app.js +0 -817
- data/assets/javascript/components/message-info.hbs +0 -47
- data/assets/javascript/components/panel-resizer.hbs +0 -0
- data/assets/javascript/components/tab-contents.hbs +0 -1
- data/assets/javascript/components/tab-link.hbs +0 -1
- data/assets/javascript/components/tabbed-section.hbs +0 -6
- data/assets/javascript/external/ember-template-compiler.js +0 -22346
- data/assets/javascript/external/ember.js +0 -58500
- data/assets/javascript/external/ember.min.js +0 -17
- data/assets/javascript/external/jquery.min.js +0 -5
- data/assets/javascript/external/lodash.min.js +0 -87
- data/assets/javascript/external/moment.min.js +0 -6
- data/assets/stylesheets/font-awesome.min.css +0 -4
- data/bower.json +0 -25
data/lib/logster.rb
CHANGED
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
require 'logster/logger'
|
|
2
|
-
require 'logster/message'
|
|
3
|
-
require 'logster/configuration'
|
|
4
|
-
require 'logster/web'
|
|
5
|
-
require 'logster/ignore_pattern'
|
|
6
|
-
|
|
7
|
-
if defined? Redis
|
|
8
|
-
require 'logster/redis_store'
|
|
9
|
-
else
|
|
10
|
-
STDERR.puts "ERROR: Redis is not loaded, ensure redis gem is required before logster"
|
|
11
|
-
exit
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
module Logster
|
|
15
|
-
def self.logger=(logger)
|
|
16
|
-
@logger = logger
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def self.logger
|
|
20
|
-
@logger
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def self.store=(store)
|
|
24
|
-
@store=store
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def self.store
|
|
28
|
-
@store
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def self.config=(config)
|
|
32
|
-
@config = config
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def self.config
|
|
36
|
-
@config ||= Configuration.new
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def self.add_to_env(env, key, value)
|
|
40
|
-
logster_env = Logster::Message.populate_from_env(env)
|
|
41
|
-
logster_env[key] = value
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def self.set_environments(envs)
|
|
45
|
-
config.environments = envs
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# check logster/configuration.rb for config options
|
|
50
|
-
# Logster.config.environments << :staging
|
|
51
|
-
|
|
52
|
-
if defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i >= 3
|
|
53
|
-
require 'logster/rails/railtie'
|
|
54
|
-
end
|
|
1
|
+
require 'logster/logger'
|
|
2
|
+
require 'logster/message'
|
|
3
|
+
require 'logster/configuration'
|
|
4
|
+
require 'logster/web'
|
|
5
|
+
require 'logster/ignore_pattern'
|
|
6
|
+
|
|
7
|
+
if defined? Redis
|
|
8
|
+
require 'logster/redis_store'
|
|
9
|
+
else
|
|
10
|
+
STDERR.puts "ERROR: Redis is not loaded, ensure redis gem is required before logster"
|
|
11
|
+
exit
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
module Logster
|
|
15
|
+
def self.logger=(logger)
|
|
16
|
+
@logger = logger
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.logger
|
|
20
|
+
@logger
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.store=(store)
|
|
24
|
+
@store=store
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.store
|
|
28
|
+
@store
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.config=(config)
|
|
32
|
+
@config = config
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.config
|
|
36
|
+
@config ||= Configuration.new
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.add_to_env(env, key, value)
|
|
40
|
+
logster_env = Logster::Message.populate_from_env(env)
|
|
41
|
+
logster_env[key] = value
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def self.set_environments(envs)
|
|
45
|
+
config.environments = envs
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# check logster/configuration.rb for config options
|
|
50
|
+
# Logster.config.environments << :staging
|
|
51
|
+
|
|
52
|
+
if defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i >= 3
|
|
53
|
+
require 'logster/rails/railtie'
|
|
54
|
+
end
|
data/lib/logster/base_store.rb
CHANGED
|
@@ -1,130 +1,130 @@
|
|
|
1
|
-
|
|
2
|
-
module Logster
|
|
3
|
-
class BaseStore
|
|
4
|
-
|
|
5
|
-
attr_accessor :level, :max_retention, :skip_empty, :ignore
|
|
6
|
-
|
|
7
|
-
def initialize
|
|
8
|
-
@max_retention = 60 * 60 * 24 * 7
|
|
9
|
-
@skip_empty = true
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
# Save a new message at the front of the latest list.
|
|
13
|
-
def save(message)
|
|
14
|
-
not_implemented
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# Modify the saved message to the given one (identified by message.key) and bump it to the top of the latest list
|
|
18
|
-
def replace_and_bump(message)
|
|
19
|
-
not_implemented
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Check if another message with the same grouping_key is already stored.
|
|
23
|
-
# Returns the similar message's message.key
|
|
24
|
-
def similar_key(message)
|
|
25
|
-
not_implemented
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# The number of messages currently stored.
|
|
29
|
-
def count
|
|
30
|
-
not_implemented
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# Delete all unprotected messages in the store.
|
|
34
|
-
def clear
|
|
35
|
-
not_implemented
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# Delete all messages, including protected messages.
|
|
39
|
-
def clear_all
|
|
40
|
-
not_implemented
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Get a message by its message_key
|
|
44
|
-
def get(message_key)
|
|
45
|
-
not_implemented
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Mark a message as protected; i.e. it is not deleted by the #clear method
|
|
49
|
-
def protect(message_key)
|
|
50
|
-
not_implemented
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def delete(message_key)
|
|
54
|
-
not_implemented
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Clear the protected mark for a message.
|
|
58
|
-
def unprotect(message_key)
|
|
59
|
-
not_implemented
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# Solve a particular message, causing all old messages with matching version and backtrace
|
|
63
|
-
# to be deleted (report should delete any solved messages when called)
|
|
64
|
-
def solve(message_key)
|
|
65
|
-
not_implemented
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# Registers a rate limit on the given severities of logs
|
|
69
|
-
def register_rate_limit(severities, limit, duration, &block)
|
|
70
|
-
not_implemented
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# Checks all the existing rate limiters to check if any has been exceeded
|
|
74
|
-
def check_rate_limits(severity)
|
|
75
|
-
not_implemented
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def report(severity, progname, msg, opts = {})
|
|
79
|
-
return if (!msg || (String === msg && msg.empty?)) && skip_empty
|
|
80
|
-
return if level && severity < level
|
|
81
|
-
|
|
82
|
-
message = Logster::Message.new(severity, progname, msg, opts[:timestamp])
|
|
83
|
-
|
|
84
|
-
env = opts[:env] || {}
|
|
85
|
-
backtrace = opts[:backtrace]
|
|
86
|
-
|
|
87
|
-
if env[:backtrace]
|
|
88
|
-
# Special - passing backtrace through env
|
|
89
|
-
backtrace = env.delete(:backtrace)
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
message.populate_from_env(env)
|
|
93
|
-
|
|
94
|
-
if backtrace
|
|
95
|
-
if backtrace.respond_to? :join
|
|
96
|
-
backtrace = backtrace.join("\n")
|
|
97
|
-
end
|
|
98
|
-
message.backtrace = backtrace
|
|
99
|
-
else
|
|
100
|
-
message.backtrace = caller.join("\n")
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
return if ignore && ignore.any? { |pattern| message =~ pattern}
|
|
104
|
-
|
|
105
|
-
similar = nil
|
|
106
|
-
|
|
107
|
-
if Logster.config.allow_grouping
|
|
108
|
-
key = self.similar_key(message)
|
|
109
|
-
similar = get key if key
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
if similar
|
|
113
|
-
similar.count += 1
|
|
114
|
-
similar.merge_similar_message(message)
|
|
115
|
-
|
|
116
|
-
replace_and_bump similar
|
|
117
|
-
similar
|
|
118
|
-
else
|
|
119
|
-
save message
|
|
120
|
-
message
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
private
|
|
125
|
-
|
|
126
|
-
def not_implemented
|
|
127
|
-
raise "Not Implemented"
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
end
|
|
1
|
+
|
|
2
|
+
module Logster
|
|
3
|
+
class BaseStore
|
|
4
|
+
|
|
5
|
+
attr_accessor :level, :max_retention, :skip_empty, :ignore
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
@max_retention = 60 * 60 * 24 * 7
|
|
9
|
+
@skip_empty = true
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Save a new message at the front of the latest list.
|
|
13
|
+
def save(message)
|
|
14
|
+
not_implemented
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Modify the saved message to the given one (identified by message.key) and bump it to the top of the latest list
|
|
18
|
+
def replace_and_bump(message)
|
|
19
|
+
not_implemented
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Check if another message with the same grouping_key is already stored.
|
|
23
|
+
# Returns the similar message's message.key
|
|
24
|
+
def similar_key(message)
|
|
25
|
+
not_implemented
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# The number of messages currently stored.
|
|
29
|
+
def count
|
|
30
|
+
not_implemented
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Delete all unprotected messages in the store.
|
|
34
|
+
def clear
|
|
35
|
+
not_implemented
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Delete all messages, including protected messages.
|
|
39
|
+
def clear_all
|
|
40
|
+
not_implemented
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Get a message by its message_key
|
|
44
|
+
def get(message_key)
|
|
45
|
+
not_implemented
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Mark a message as protected; i.e. it is not deleted by the #clear method
|
|
49
|
+
def protect(message_key)
|
|
50
|
+
not_implemented
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def delete(message_key)
|
|
54
|
+
not_implemented
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Clear the protected mark for a message.
|
|
58
|
+
def unprotect(message_key)
|
|
59
|
+
not_implemented
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Solve a particular message, causing all old messages with matching version and backtrace
|
|
63
|
+
# to be deleted (report should delete any solved messages when called)
|
|
64
|
+
def solve(message_key)
|
|
65
|
+
not_implemented
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Registers a rate limit on the given severities of logs
|
|
69
|
+
def register_rate_limit(severities, limit, duration, &block)
|
|
70
|
+
not_implemented
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Checks all the existing rate limiters to check if any has been exceeded
|
|
74
|
+
def check_rate_limits(severity)
|
|
75
|
+
not_implemented
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def report(severity, progname, msg, opts = {})
|
|
79
|
+
return if (!msg || (String === msg && msg.empty?)) && skip_empty
|
|
80
|
+
return if level && severity < level
|
|
81
|
+
|
|
82
|
+
message = Logster::Message.new(severity, progname, msg, opts[:timestamp])
|
|
83
|
+
|
|
84
|
+
env = opts[:env] || {}
|
|
85
|
+
backtrace = opts[:backtrace]
|
|
86
|
+
|
|
87
|
+
if env[:backtrace]
|
|
88
|
+
# Special - passing backtrace through env
|
|
89
|
+
backtrace = env.delete(:backtrace)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
message.populate_from_env(env)
|
|
93
|
+
|
|
94
|
+
if backtrace
|
|
95
|
+
if backtrace.respond_to? :join
|
|
96
|
+
backtrace = backtrace.join("\n")
|
|
97
|
+
end
|
|
98
|
+
message.backtrace = backtrace
|
|
99
|
+
else
|
|
100
|
+
message.backtrace = caller.join("\n")
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
return if ignore && ignore.any? { |pattern| message =~ pattern}
|
|
104
|
+
|
|
105
|
+
similar = nil
|
|
106
|
+
|
|
107
|
+
if Logster.config.allow_grouping
|
|
108
|
+
key = self.similar_key(message)
|
|
109
|
+
similar = get key if key
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
if similar
|
|
113
|
+
similar.count += 1
|
|
114
|
+
similar.merge_similar_message(message)
|
|
115
|
+
|
|
116
|
+
replace_and_bump similar
|
|
117
|
+
similar
|
|
118
|
+
else
|
|
119
|
+
save message
|
|
120
|
+
message
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
private
|
|
125
|
+
|
|
126
|
+
def not_implemented
|
|
127
|
+
raise "Not Implemented"
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
module Logster
|
|
2
|
-
class Configuration
|
|
3
|
-
attr_accessor :current_context, :allow_grouping, :environments,
|
|
4
|
-
:application_version, :web_title
|
|
5
|
-
|
|
6
|
-
attr_writer :subdirectory
|
|
7
|
-
|
|
8
|
-
def initialize
|
|
9
|
-
# lambda |env,block|
|
|
10
|
-
@current_context = lambda{ |_, &block| block.call }
|
|
11
|
-
@environments = [:development, :production]
|
|
12
|
-
@subdirectory = nil
|
|
13
|
-
|
|
14
|
-
@allow_grouping = false
|
|
15
|
-
|
|
16
|
-
if defined?(::Rails) && defined?(::Rails.env) && ::Rails.env.production?
|
|
17
|
-
@allow_grouping = true
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def subdirectory
|
|
22
|
-
@subdirectory || '/logs'
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
1
|
+
module Logster
|
|
2
|
+
class Configuration
|
|
3
|
+
attr_accessor :current_context, :allow_grouping, :environments,
|
|
4
|
+
:application_version, :web_title
|
|
5
|
+
|
|
6
|
+
attr_writer :subdirectory
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
# lambda |env,block|
|
|
10
|
+
@current_context = lambda{ |_, &block| block.call }
|
|
11
|
+
@environments = [:development, :production]
|
|
12
|
+
@subdirectory = nil
|
|
13
|
+
|
|
14
|
+
@allow_grouping = false
|
|
15
|
+
|
|
16
|
+
if defined?(::Rails) && defined?(::Rails.env) && ::Rails.env.production?
|
|
17
|
+
@allow_grouping = true
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def subdirectory
|
|
22
|
+
@subdirectory || '/logs'
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
module Logster
|
|
2
|
-
class IgnorePattern
|
|
3
|
-
|
|
4
|
-
def initialize(message_pattern=nil, env_patterns=nil)
|
|
5
|
-
@msg_match = message_pattern
|
|
6
|
-
@env_match = env_patterns
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def self.from_message_and_request_uri(msg, request)
|
|
10
|
-
IgnorePattern.new(msg, {REQUEST_URI: request})
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def matches?(message)
|
|
14
|
-
if @msg_match
|
|
15
|
-
return false unless compare(message.message, @msg_match)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
if @env_match
|
|
19
|
-
return false unless compare(message.env, @env_match)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
true
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def to_s
|
|
26
|
-
"<#Logster::IgnorePattern, msg_match: #{@msg_match.inspect}, env_match: #{@env_match.inspect}>"
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
def compare(message, pattern)
|
|
32
|
-
return false unless message && pattern
|
|
33
|
-
|
|
34
|
-
case pattern
|
|
35
|
-
when Regexp
|
|
36
|
-
message.to_s =~ pattern
|
|
37
|
-
when String
|
|
38
|
-
message.to_s.downcase =~ Regexp.new(pattern.downcase, Regexp::IGNORECASE)
|
|
39
|
-
when Hash
|
|
40
|
-
if Hash === message
|
|
41
|
-
compare_hash(message, pattern)
|
|
42
|
-
else
|
|
43
|
-
false
|
|
44
|
-
end
|
|
45
|
-
else
|
|
46
|
-
false
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def compare_hash(message_hash, pattern_hash)
|
|
51
|
-
return false unless message_hash
|
|
52
|
-
pattern_hash.each do |key, value|
|
|
53
|
-
return false unless compare(get_indifferent(message_hash, key), value)
|
|
54
|
-
end
|
|
55
|
-
true
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def get_indifferent(hash, key)
|
|
59
|
-
return hash[key] if hash[key]
|
|
60
|
-
return hash[key.to_s] if hash[key.to_s]
|
|
61
|
-
# no key.to_sym please, memory leak in Ruby < 2.2
|
|
62
|
-
nil
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
end
|
|
1
|
+
module Logster
|
|
2
|
+
class IgnorePattern
|
|
3
|
+
|
|
4
|
+
def initialize(message_pattern=nil, env_patterns=nil)
|
|
5
|
+
@msg_match = message_pattern
|
|
6
|
+
@env_match = env_patterns
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.from_message_and_request_uri(msg, request)
|
|
10
|
+
IgnorePattern.new(msg, {REQUEST_URI: request})
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def matches?(message)
|
|
14
|
+
if @msg_match
|
|
15
|
+
return false unless compare(message.message, @msg_match)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
if @env_match
|
|
19
|
+
return false unless compare(message.env, @env_match)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
true
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def to_s
|
|
26
|
+
"<#Logster::IgnorePattern, msg_match: #{@msg_match.inspect}, env_match: #{@env_match.inspect}>"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def compare(message, pattern)
|
|
32
|
+
return false unless message && pattern
|
|
33
|
+
|
|
34
|
+
case pattern
|
|
35
|
+
when Regexp
|
|
36
|
+
message.to_s =~ pattern
|
|
37
|
+
when String
|
|
38
|
+
message.to_s.downcase =~ Regexp.new(pattern.downcase, Regexp::IGNORECASE)
|
|
39
|
+
when Hash
|
|
40
|
+
if Hash === message
|
|
41
|
+
compare_hash(message, pattern)
|
|
42
|
+
else
|
|
43
|
+
false
|
|
44
|
+
end
|
|
45
|
+
else
|
|
46
|
+
false
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def compare_hash(message_hash, pattern_hash)
|
|
51
|
+
return false unless message_hash
|
|
52
|
+
pattern_hash.each do |key, value|
|
|
53
|
+
return false unless compare(get_indifferent(message_hash, key), value)
|
|
54
|
+
end
|
|
55
|
+
true
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def get_indifferent(hash, key)
|
|
59
|
+
return hash[key] if hash[key]
|
|
60
|
+
return hash[key.to_s] if hash[key.to_s]
|
|
61
|
+
# no key.to_sym please, memory leak in Ruby < 2.2
|
|
62
|
+
nil
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|