logster 2.1.2 → 2.2.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/.gitignore +21 -19
- data/.rubocop.yml +1 -1
- data/.travis.yml +16 -16
- data/CHANGELOG.md +224 -172
- data/Gemfile +4 -4
- data/Guardfile +8 -8
- data/LICENSE.txt +22 -22
- data/README.md +99 -99
- data/Rakefile +21 -21
- 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 +115 -106
- data/assets/stylesheets/client-app.css +1 -1
- data/build_client_app.sh +0 -0
- data/client-app/.editorconfig +20 -20
- data/client-app/.ember-cli +9 -9
- data/client-app/.eslintignore +19 -19
- data/client-app/.eslintrc.js +46 -46
- data/client-app/.gitignore +23 -23
- data/client-app/.travis.yml +27 -27
- data/client-app/.watchmanconfig +3 -3
- data/client-app/README.md +57 -57
- data/client-app/app/app.js +0 -0
- data/client-app/app/components/actions-menu.js +43 -43
- data/client-app/app/components/env-tab.js +80 -80
- data/client-app/app/components/message-info.js +0 -0
- data/client-app/app/components/message-row.js +0 -0
- data/client-app/app/components/panel-resizer.js +0 -0
- data/client-app/app/components/patterns-list.js +109 -0
- data/client-app/app/components/tab-contents.js +27 -27
- data/client-app/app/components/tabbed-section.js +0 -0
- data/client-app/app/components/time-formatter.js +0 -0
- data/client-app/app/components/update-time.js +0 -0
- data/client-app/app/controllers/index.js +22 -6
- data/client-app/app/controllers/show.js +0 -0
- data/client-app/app/helpers/logster-url.js +12 -0
- data/client-app/app/helpers/or.js +7 -0
- data/client-app/app/index.html +30 -29
- data/client-app/app/initializers/app-init.js +67 -67
- data/client-app/app/lib/preload.js +20 -20
- data/client-app/app/lib/utilities.js +150 -149
- data/client-app/app/models/message-collection.js +0 -0
- data/client-app/app/models/message.js +100 -100
- data/client-app/app/models/pattern-item.js +25 -0
- data/client-app/app/resolver.js +0 -0
- data/client-app/app/router.js +1 -0
- data/client-app/app/routes/index.js +2 -9
- data/client-app/app/routes/settings.js +15 -0
- data/client-app/app/routes/show.js +0 -0
- data/client-app/app/styles/app.css +633 -527
- data/client-app/app/templates/application.hbs +2 -2
- data/client-app/app/templates/components/actions-menu.hbs +12 -12
- data/client-app/app/templates/components/env-tab.hbs +10 -10
- data/client-app/app/templates/components/message-info.hbs +41 -41
- data/client-app/app/templates/components/message-row.hbs +15 -15
- data/client-app/app/templates/components/panel-resizer.hbs +3 -3
- data/client-app/app/templates/components/patterns-list.hbs +25 -0
- data/client-app/app/templates/components/tabbed-section.hbs +10 -10
- data/client-app/app/templates/components/time-formatter.hbs +1 -1
- data/client-app/app/templates/index.hbs +65 -58
- data/client-app/app/templates/settings.hbs +26 -0
- data/client-app/app/templates/show.hbs +7 -7
- data/client-app/config/environment.js +51 -51
- data/client-app/config/optional-features.json +3 -3
- data/client-app/config/targets.js +18 -18
- data/client-app/ember-cli-build.js +29 -29
- data/client-app/package-lock.json +11357 -11365
- data/client-app/package.json +57 -56
- data/client-app/public/assets/images/icon_144x144.png +0 -0
- data/client-app/public/assets/images/icon_64x64.png +0 -0
- data/client-app/testem.js +25 -25
- data/client-app/tests/index.html +34 -34
- data/client-app/tests/integration/components/env-tab-test.js +134 -123
- data/client-app/tests/integration/components/message-info-test.js +111 -111
- data/client-app/tests/integration/components/patterns-list-test.js +56 -0
- data/client-app/tests/test-helper.js +8 -8
- data/client-app/tests/unit/controllers/index-test.js +12 -12
- data/client-app/tests/unit/controllers/show-test.js +12 -12
- data/client-app/tests/unit/initializers/app-init-test.js +31 -31
- data/client-app/tests/unit/routes/index-test.js +11 -11
- data/client-app/tests/unit/routes/show-test.js +11 -11
- data/lib/examples/sidekiq_logster_reporter.rb +21 -21
- data/lib/logster.rb +59 -54
- data/lib/logster/base_store.rb +169 -141
- data/lib/logster/cache.rb +20 -0
- data/lib/logster/configuration.rb +27 -26
- data/lib/logster/defer_logger.rb +14 -14
- data/lib/logster/ignore_pattern.rb +65 -65
- data/lib/logster/logger.rb +113 -113
- data/lib/logster/message.rb +212 -212
- data/lib/logster/middleware/debug_exceptions.rb +26 -26
- data/lib/logster/middleware/reporter.rb +55 -55
- data/lib/logster/middleware/viewer.rb +297 -222
- data/lib/logster/pattern.rb +95 -0
- data/lib/logster/rails/railtie.rb +63 -63
- data/lib/logster/redis_store.rb +584 -566
- data/lib/logster/scheduler.rb +54 -54
- data/lib/logster/suppression_pattern.rb +17 -0
- data/lib/logster/version.rb +3 -3
- data/lib/logster/web.rb +14 -14
- data/logster.gemspec +35 -35
- 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 +19 -19
- data/test/logster/middleware/test_viewer.rb +267 -96
- data/test/logster/test_base_store.rb +147 -147
- data/test/logster/test_cache.rb +38 -0
- data/test/logster/test_defer_logger.rb +34 -34
- data/test/logster/test_ignore_pattern.rb +41 -41
- data/test/logster/test_logger.rb +100 -86
- data/test/logster/test_message.rb +119 -119
- data/test/logster/test_pattern.rb +152 -0
- data/test/logster/test_redis_rate_limiter.rb +230 -230
- data/test/logster/test_redis_store.rb +689 -720
- data/test/test_helper.rb +38 -38
- data/vendor/assets/javascripts/logster.js.erb +39 -39
- metadata +24 -7
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Logster
|
|
2
|
+
class Cache
|
|
3
|
+
def initialize(age = 2)
|
|
4
|
+
@age = age
|
|
5
|
+
@hash = { created_at: Process.clock_gettime(Process::CLOCK_MONOTONIC) }
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def fetch
|
|
9
|
+
if !@hash.key?(:data) || @hash[:created_at] + @age < Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
10
|
+
@hash[:data] = yield
|
|
11
|
+
@hash[:created_at] = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
12
|
+
end
|
|
13
|
+
@hash[:data]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def clear
|
|
17
|
+
@hash.delete(:data)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -1,26 +1,27 @@
|
|
|
1
|
-
module Logster
|
|
2
|
-
class Configuration
|
|
3
|
-
attr_accessor :current_context, :allow_grouping, :environments,
|
|
4
|
-
:application_version, :web_title, :env_expandable_keys
|
|
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
|
-
@env_expandable_keys = []
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
end
|
|
1
|
+
module Logster
|
|
2
|
+
class Configuration
|
|
3
|
+
attr_accessor :current_context, :allow_grouping, :environments,
|
|
4
|
+
:application_version, :web_title, :env_expandable_keys, :enable_custom_patterns_via_ui
|
|
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
|
+
@env_expandable_keys = []
|
|
14
|
+
@enable_custom_patterns_via_ui = false
|
|
15
|
+
|
|
16
|
+
@allow_grouping = false
|
|
17
|
+
|
|
18
|
+
if defined?(::Rails) && defined?(::Rails.env) && ::Rails.env.production?
|
|
19
|
+
@allow_grouping = true
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def subdirectory
|
|
24
|
+
@subdirectory || '/logs'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
data/lib/logster/defer_logger.rb
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
require 'logster/scheduler'
|
|
2
|
-
|
|
3
|
-
module Logster
|
|
4
|
-
class DeferLogger < ::Logster::Logger
|
|
5
|
-
private
|
|
6
|
-
|
|
7
|
-
def report_to_store(severity, progname, message, opts = {})
|
|
8
|
-
opts[:backtrace] ||= caller
|
|
9
|
-
Logster::Scheduler.schedule do
|
|
10
|
-
super(severity, progname, message, opts)
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
1
|
+
require 'logster/scheduler'
|
|
2
|
+
|
|
3
|
+
module Logster
|
|
4
|
+
class DeferLogger < ::Logster::Logger
|
|
5
|
+
private
|
|
6
|
+
|
|
7
|
+
def report_to_store(severity, progname, message, opts = {})
|
|
8
|
+
opts[:backtrace] ||= caller
|
|
9
|
+
Logster::Scheduler.schedule do
|
|
10
|
+
super(severity, progname, message, opts)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
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 =~ Regexp.new(pattern, 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 =~ Regexp.new(pattern, 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
|
data/lib/logster/logger.rb
CHANGED
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
require 'logger'
|
|
2
|
-
|
|
3
|
-
module Logster
|
|
4
|
-
class Logger < ::Logger
|
|
5
|
-
LOGSTER_ENV = "logster_env".freeze
|
|
6
|
-
|
|
7
|
-
attr_accessor :store, :skip_store
|
|
8
|
-
attr_reader :chained
|
|
9
|
-
|
|
10
|
-
def initialize(store)
|
|
11
|
-
super(nil)
|
|
12
|
-
@store = store
|
|
13
|
-
@override_levels = nil
|
|
14
|
-
@chained = []
|
|
15
|
-
@skip_store = false
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def override_level=(val)
|
|
19
|
-
tid = Thread.current.object_id
|
|
20
|
-
|
|
21
|
-
ol = @override_levels
|
|
22
|
-
if val.nil? && ol && ol.key?(tid)
|
|
23
|
-
ol.delete(tid)
|
|
24
|
-
@override_levels = nil if ol.length == 0
|
|
25
|
-
elsif val
|
|
26
|
-
(@override_levels ||= {})[tid] = val
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def chain(logger)
|
|
31
|
-
@chained << logger
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def add_to_chained(logger, severity, message, progname, opts = nil, &block)
|
|
35
|
-
if logger.respond_to? :skip_store
|
|
36
|
-
old = logger.skip_store
|
|
37
|
-
logger.skip_store = @skip_store
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
if logger.is_a?(
|
|
41
|
-
logger.add(severity, message, progname, opts, &block)
|
|
42
|
-
else
|
|
43
|
-
logger.add(severity, message, progname, &block)
|
|
44
|
-
end
|
|
45
|
-
ensure
|
|
46
|
-
if logger.respond_to? :skip_store
|
|
47
|
-
logger.skip_store = old
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def add(*args, &block)
|
|
52
|
-
add_with_opts(*args, &block)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def level
|
|
56
|
-
ol = @override_levels
|
|
57
|
-
(ol && ol[Thread.current.object_id]) || @level
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def add_with_opts(severity, message, progname = progname(), opts = nil, &block)
|
|
61
|
-
if severity < level
|
|
62
|
-
return true
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# it is not fun losing messages cause encoding is bad
|
|
66
|
-
# protect all messages by scrubbing if needed
|
|
67
|
-
if message && !message.valid_encoding?
|
|
68
|
-
message = message.scrub
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
if @chained
|
|
72
|
-
i = 0
|
|
73
|
-
# micro optimise for logging
|
|
74
|
-
while i < @chained.length
|
|
75
|
-
# TODO double yielding blocks
|
|
76
|
-
begin
|
|
77
|
-
add_to_chained(@chained[i], severity, message, progname, opts, &block)
|
|
78
|
-
rescue => e
|
|
79
|
-
# don't blow up if STDERR is somehow closed
|
|
80
|
-
STDERR.puts "Failed to report message to chained logger #{e}" rescue nil
|
|
81
|
-
end
|
|
82
|
-
i += 1
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
progname ||= @progname
|
|
87
|
-
if message.nil?
|
|
88
|
-
if block_given?
|
|
89
|
-
message = yield
|
|
90
|
-
else
|
|
91
|
-
message = progname
|
|
92
|
-
progname = @progname
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
return if @skip_store
|
|
97
|
-
|
|
98
|
-
opts ||= {}
|
|
99
|
-
opts[:env] ||= Thread.current[LOGSTER_ENV]
|
|
100
|
-
|
|
101
|
-
report_to_store(severity, progname, message, opts)
|
|
102
|
-
rescue => e
|
|
103
|
-
# don't blow up if STDERR is somehow closed
|
|
104
|
-
STDERR.puts "Failed to report error: #{e} #{severity} #{message} #{progname}" rescue nil
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
private
|
|
108
|
-
|
|
109
|
-
def report_to_store(severity, progname, message, opts = {})
|
|
110
|
-
@store.report(severity, progname, message, opts)
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
end
|
|
1
|
+
require 'logger'
|
|
2
|
+
|
|
3
|
+
module Logster
|
|
4
|
+
class Logger < ::Logger
|
|
5
|
+
LOGSTER_ENV = "logster_env".freeze
|
|
6
|
+
|
|
7
|
+
attr_accessor :store, :skip_store
|
|
8
|
+
attr_reader :chained
|
|
9
|
+
|
|
10
|
+
def initialize(store)
|
|
11
|
+
super(nil)
|
|
12
|
+
@store = store
|
|
13
|
+
@override_levels = nil
|
|
14
|
+
@chained = []
|
|
15
|
+
@skip_store = false
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def override_level=(val)
|
|
19
|
+
tid = Thread.current.object_id
|
|
20
|
+
|
|
21
|
+
ol = @override_levels
|
|
22
|
+
if val.nil? && ol && ol.key?(tid)
|
|
23
|
+
ol.delete(tid)
|
|
24
|
+
@override_levels = nil if ol.length == 0
|
|
25
|
+
elsif val
|
|
26
|
+
(@override_levels ||= {})[tid] = val
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def chain(logger)
|
|
31
|
+
@chained << logger
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def add_to_chained(logger, severity, message, progname, opts = nil, &block)
|
|
35
|
+
if logger.respond_to? :skip_store
|
|
36
|
+
old = logger.skip_store
|
|
37
|
+
logger.skip_store = @skip_store
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
if logger.is_a?(Logster::Logger)
|
|
41
|
+
logger.add(severity, message, progname, opts, &block)
|
|
42
|
+
else
|
|
43
|
+
logger.add(severity, message, progname, &block)
|
|
44
|
+
end
|
|
45
|
+
ensure
|
|
46
|
+
if logger.respond_to? :skip_store
|
|
47
|
+
logger.skip_store = old
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def add(*args, &block)
|
|
52
|
+
add_with_opts(*args, &block)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def level
|
|
56
|
+
ol = @override_levels
|
|
57
|
+
(ol && ol[Thread.current.object_id]) || @level
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def add_with_opts(severity, message, progname = progname(), opts = nil, &block)
|
|
61
|
+
if severity < level
|
|
62
|
+
return true
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# it is not fun losing messages cause encoding is bad
|
|
66
|
+
# protect all messages by scrubbing if needed
|
|
67
|
+
if message && !message.valid_encoding?
|
|
68
|
+
message = message.scrub
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
if @chained
|
|
72
|
+
i = 0
|
|
73
|
+
# micro optimise for logging
|
|
74
|
+
while i < @chained.length
|
|
75
|
+
# TODO double yielding blocks
|
|
76
|
+
begin
|
|
77
|
+
add_to_chained(@chained[i], severity, message, progname, opts, &block)
|
|
78
|
+
rescue => e
|
|
79
|
+
# don't blow up if STDERR is somehow closed
|
|
80
|
+
STDERR.puts "Failed to report message to chained logger #{e}" rescue nil
|
|
81
|
+
end
|
|
82
|
+
i += 1
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
progname ||= @progname
|
|
87
|
+
if message.nil?
|
|
88
|
+
if block_given?
|
|
89
|
+
message = yield
|
|
90
|
+
else
|
|
91
|
+
message = progname
|
|
92
|
+
progname = @progname
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
return if @skip_store
|
|
97
|
+
|
|
98
|
+
opts ||= {}
|
|
99
|
+
opts[:env] ||= Thread.current[LOGSTER_ENV]
|
|
100
|
+
|
|
101
|
+
report_to_store(severity, progname, message, opts)
|
|
102
|
+
rescue => e
|
|
103
|
+
# don't blow up if STDERR is somehow closed
|
|
104
|
+
STDERR.puts "Failed to report error: #{e} #{severity} #{message} #{progname}" rescue nil
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
private
|
|
108
|
+
|
|
109
|
+
def report_to_store(severity, progname, message, opts = {})
|
|
110
|
+
@store.report(severity, progname, message, opts)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|