semantic_logger 2.15.0 → 2.16.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/README.md +16 -47
- data/Rakefile +5 -5
- data/lib/semantic_logger.rb +2 -0
- data/lib/semantic_logger/appender/base.rb +24 -19
- data/lib/semantic_logger/appender/bugsnag.rb +1 -1
- data/lib/semantic_logger/appender/file.rb +9 -8
- data/lib/semantic_logger/appender/mongodb.rb +14 -14
- data/lib/semantic_logger/appender/new_relic.rb +7 -7
- data/lib/semantic_logger/appender/splunk.rb +3 -3
- data/lib/semantic_logger/appender/syslog.rb +33 -33
- data/lib/semantic_logger/appender/wrapper.rb +3 -3
- data/lib/semantic_logger/base.rb +31 -29
- data/lib/semantic_logger/jruby/garbage_collection_logger.rb +2 -2
- data/lib/semantic_logger/loggable.rb +2 -2
- data/lib/semantic_logger/logger.rb +12 -12
- data/lib/semantic_logger/semantic_logger.rb +39 -39
- data/lib/semantic_logger/version.rb +1 -1
- data/test/appender_bugsnag_test.rb +9 -9
- data/test/appender_file_test.rb +20 -20
- data/test/appender_mongodb_test.rb +16 -16
- data/test/appender_new_relic_test.rb +10 -10
- data/test/appender_splunk_test.rb +12 -18
- data/test/appender_syslog_test.rb +8 -8
- data/test/appender_wrapper_test.rb +27 -27
- data/test/debug_as_trace_logger_test.rb +37 -37
- data/test/loggable_test.rb +12 -12
- data/test/logger_test.rb +90 -91
- data/test/test_helper.rb +0 -1
- metadata +4 -4
@@ -15,7 +15,7 @@ module SemanticLogger
|
|
15
15
|
# ruby_logger = Logger.new(STDOUT)
|
16
16
|
# SemanticLogger.add_appender(ruby_logger)
|
17
17
|
# logger = SemanticLogger['test']
|
18
|
-
# logger.info('Hello World', :
|
18
|
+
# logger.info('Hello World', some: :payload)
|
19
19
|
#
|
20
20
|
# Enhance the Rails Logger
|
21
21
|
# # Add the Rails logger to the list of appenders
|
@@ -28,8 +28,8 @@ module SemanticLogger
|
|
28
28
|
# Note: Since the log level is controlled by setting the Ruby or Rails logger directly
|
29
29
|
# the level is ignored for this appender
|
30
30
|
def initialize(logger, filter=nil, &block)
|
31
|
-
raise
|
32
|
-
@logger
|
31
|
+
raise 'logger cannot be null when initiailizing the SemanticLogging::Appender::Wrapper' unless logger
|
32
|
+
@logger = logger
|
33
33
|
|
34
34
|
# Set the formatter to the supplied block
|
35
35
|
@formatter = block || self.default_formatter
|
data/lib/semantic_logger/base.rb
CHANGED
@@ -21,7 +21,7 @@ module SemanticLogger
|
|
21
21
|
# nil if this logger instance should use the global default level
|
22
22
|
def level=(level)
|
23
23
|
@level_index = SemanticLogger.level_to_index(level)
|
24
|
-
@level
|
24
|
+
@level = level
|
25
25
|
end
|
26
26
|
|
27
27
|
# Returns the current log level if set, otherwise it returns the global
|
@@ -68,7 +68,7 @@ module SemanticLogger
|
|
68
68
|
# logger.debug("Only display this if log level is set to Debug or lower")
|
69
69
|
#
|
70
70
|
# # Log semantic information along with a text message
|
71
|
-
# logger.info("Request received", :
|
71
|
+
# logger.info("Request received", user: "joe", duration: 100)
|
72
72
|
#
|
73
73
|
# # Log an exception in a semantic way
|
74
74
|
# logger.info("Parsing received XML", exc)
|
@@ -134,8 +134,8 @@ module SemanticLogger
|
|
134
134
|
# Returns the list of tags pushed after flattening them out and removing blanks
|
135
135
|
def push_tags *tags
|
136
136
|
# Need to flatten and reject empties to support calls from Rails 4
|
137
|
-
new_tags
|
138
|
-
t
|
137
|
+
new_tags = tags.flatten.collect(&:to_s).reject(&:empty?)
|
138
|
+
t = Thread.current[:semantic_logger_tags]
|
139
139
|
Thread.current[:semantic_logger_tags] = t.nil? ? new_tags : t.concat(new_tags)
|
140
140
|
new_tags
|
141
141
|
end
|
@@ -150,18 +150,18 @@ module SemanticLogger
|
|
150
150
|
#
|
151
151
|
# Add a payload to all log calls on This Thread within the supplied block
|
152
152
|
#
|
153
|
-
# logger.with_payload(:
|
153
|
+
# logger.with_payload(tracking_number: 12345) do
|
154
154
|
# logger.debug('Hello World')
|
155
155
|
# end
|
156
156
|
#
|
157
157
|
# If a log call already includes a pyload, this payload will be merged with
|
158
158
|
# the supplied payload, with the supplied payload taking precedence
|
159
159
|
#
|
160
|
-
# logger.with_payload(:
|
161
|
-
# logger.debug('Hello World', :
|
160
|
+
# logger.with_payload(tracking_number: 12345) do
|
161
|
+
# logger.debug('Hello World', result: 'blah')
|
162
162
|
# end
|
163
163
|
def with_payload(payload)
|
164
|
-
current_payload
|
164
|
+
current_payload = self.payload
|
165
165
|
Thread.current[:semantic_logger_payload] = current_payload ? current_payload.merge(payload) : payload
|
166
166
|
yield
|
167
167
|
ensure
|
@@ -218,7 +218,7 @@ module SemanticLogger
|
|
218
218
|
# #silence does not affect any loggers which have had their log level set
|
219
219
|
# explicitly. I.e. That do not rely on the global default level
|
220
220
|
def silence(new_level = :error)
|
221
|
-
current_index
|
221
|
+
current_index = Thread.current[:semantic_logger_silence]
|
222
222
|
Thread.current[:semantic_logger_silence] = SemanticLogger.level_to_index(new_level)
|
223
223
|
yield
|
224
224
|
ensure
|
@@ -227,13 +227,13 @@ module SemanticLogger
|
|
227
227
|
|
228
228
|
# DEPRECATED See SemanticLogger.default_level=
|
229
229
|
def self.default_level=(level)
|
230
|
-
warn
|
230
|
+
warn '[DEPRECATION] SemanticLogger::Logger.default_level= is deprecated. Please use SemanticLogger.default_level= instead.'
|
231
231
|
SemanticLogger.default_level = level
|
232
232
|
end
|
233
233
|
|
234
234
|
# DEPRECATED See SemanticLogger.default_level
|
235
235
|
def self.default_level
|
236
|
-
warn
|
236
|
+
warn '[DEPRECATION] SemanticLogger::Logger.default_level is deprecated. Please use SemanticLogger.default_level instead.'
|
237
237
|
SemanticLogger.default_level
|
238
238
|
end
|
239
239
|
|
@@ -260,7 +260,7 @@ module SemanticLogger
|
|
260
260
|
def initialize(klass, level=nil, filter=nil)
|
261
261
|
# Support filtering all messages to this logger using a Regular Expression
|
262
262
|
# or Proc
|
263
|
-
raise
|
263
|
+
raise ':filter must be a Regexp or Proc' unless filter.nil? || filter.is_a?(Regexp) || filter.is_a?(Proc)
|
264
264
|
|
265
265
|
@filter = filter.is_a?(Regexp) ? filter.freeze : filter
|
266
266
|
@name = klass.is_a?(String) ? klass : klass.name
|
@@ -269,7 +269,7 @@ module SemanticLogger
|
|
269
269
|
|
270
270
|
# Write log data to underlying data storage
|
271
271
|
def log(log_)
|
272
|
-
raise NotImplementedError.new(
|
272
|
+
raise NotImplementedError.new('Logging Appender must implement #log(log)')
|
273
273
|
end
|
274
274
|
|
275
275
|
# Return the level index for fast comparisons
|
@@ -334,7 +334,7 @@ module SemanticLogger
|
|
334
334
|
message = exception.inspect
|
335
335
|
elsif exception.nil? && payload && payload.is_a?(Exception)
|
336
336
|
exception = payload
|
337
|
-
payload
|
337
|
+
payload = nil
|
338
338
|
end
|
339
339
|
|
340
340
|
if block && (result = block.call)
|
@@ -357,34 +357,36 @@ module SemanticLogger
|
|
357
357
|
|
358
358
|
# Measure the supplied block and log the message
|
359
359
|
def benchmark_internal(level, index, message, params, &block)
|
360
|
-
start
|
360
|
+
start = Time.now
|
361
361
|
begin
|
362
362
|
if block
|
363
|
-
result
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
363
|
+
result =
|
364
|
+
if silence_level = params[:silence]
|
365
|
+
# In case someone accidentally sets `silence: true` instead of `silence: :error`
|
366
|
+
silence_level = :error if silence_level == true
|
367
|
+
silence(silence_level) { block.call(params) }
|
368
|
+
else
|
369
|
+
block.call(params)
|
370
|
+
end
|
370
371
|
exception = params[:exception]
|
371
372
|
result
|
372
373
|
end
|
373
374
|
rescue Exception => exc
|
374
375
|
exception = exc
|
375
376
|
ensure
|
376
|
-
end_time
|
377
|
+
end_time = Time.now
|
377
378
|
# Extract options after block completes so that block can modify any of the options
|
378
379
|
log_exception = params[:log_exception] || :partial
|
379
380
|
on_exception_level = params[:on_exception_level]
|
380
381
|
min_duration = params[:min_duration] || 0.0
|
381
382
|
payload = params[:payload]
|
382
383
|
metric = params[:metric]
|
383
|
-
duration =
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
384
|
+
duration =
|
385
|
+
if block_given?
|
386
|
+
1000.0 * (end_time - start)
|
387
|
+
else
|
388
|
+
params[:duration] || raise('Mandatory block missing when :duration option is not supplied')
|
389
|
+
end
|
388
390
|
|
389
391
|
# Add scoped payload
|
390
392
|
if self.payload
|
@@ -405,7 +407,7 @@ module SemanticLogger
|
|
405
407
|
level = on_exception_level
|
406
408
|
index = SemanticLogger.level_to_index(level)
|
407
409
|
end
|
408
|
-
message
|
410
|
+
message = "#{message} -- Exception: #{exception.class}: #{exception.message}"
|
409
411
|
logged_exception = nil
|
410
412
|
else
|
411
413
|
# Log the message with its duration but leave out the exception that was raised
|
@@ -14,8 +14,8 @@ module SemanticLogger
|
|
14
14
|
# Only care about GARBAGE_COLLECTION_NOTIFICATION notifications
|
15
15
|
return unless notification.get_type == Java::ComSunManagement::GarbageCollectionNotificationInfo::GARBAGE_COLLECTION_NOTIFICATION
|
16
16
|
|
17
|
-
info
|
18
|
-
gc_info
|
17
|
+
info = Java::ComSunManagement::GarbageCollectionNotificationInfo.from(notification.user_data)
|
18
|
+
gc_info = info.gc_info
|
19
19
|
duration = gc_info.duration
|
20
20
|
if duration >= @min_microseconds
|
21
21
|
SemanticLogger['GarbageCollector'].benchmark_warn "Garbage Collection completed: #{info.gc_name} ##{gc_info.id}", duration: duration.to_f / 1000
|
@@ -18,7 +18,7 @@ require 'sync_attr'
|
|
18
18
|
# include SemanticLogger::Loggable
|
19
19
|
#
|
20
20
|
# def call_supplier(amount, name)
|
21
|
-
# logger.debug "Calculating with amount", { :
|
21
|
+
# logger.debug "Calculating with amount", { amount: amount, name: name }
|
22
22
|
#
|
23
23
|
# # Measure and log on completion how long the call took to the external supplier
|
24
24
|
# logger.benchmark_info "Calling external interface" do
|
@@ -94,4 +94,4 @@ module SemanticLogger
|
|
94
94
|
end
|
95
95
|
|
96
96
|
end
|
97
|
-
end
|
97
|
+
end
|
@@ -60,12 +60,12 @@ module SemanticLogger
|
|
60
60
|
|
61
61
|
logger.debug "Flushing appenders with #{queue_size} log messages on the queue"
|
62
62
|
reply_queue = Queue.new
|
63
|
-
queue << {
|
63
|
+
queue << {command: :flush, reply_queue: reply_queue}
|
64
64
|
reply_queue.pop
|
65
65
|
end
|
66
66
|
|
67
67
|
@@lag_check_interval = 5000
|
68
|
-
@@lag_threshold_s
|
68
|
+
@@lag_threshold_s = 30
|
69
69
|
|
70
70
|
# Returns the check_interval which is the number of messages between checks
|
71
71
|
# to determine if the appender thread is falling behind
|
@@ -99,13 +99,13 @@ module SemanticLogger
|
|
99
99
|
|
100
100
|
# DEPRECATED See SemanticLogger.add_appender
|
101
101
|
def self.appenders
|
102
|
-
warn
|
102
|
+
warn '[DEPRECATION] SemanticLogger::Logger.appenders is deprecated. Please use SemanticLogger.add_appender instead.'
|
103
103
|
SemanticLogger.appenders
|
104
104
|
end
|
105
105
|
|
106
106
|
# DEPRECATED: Please use queue_size instead.
|
107
107
|
def self.cache_count
|
108
|
-
warn
|
108
|
+
warn '[DEPRECATION] SemanticLogger::Logger.cache_count is deprecated. Please use SemanticLogger::Logger.queue_size instead.'
|
109
109
|
queue_size
|
110
110
|
end
|
111
111
|
|
@@ -120,7 +120,7 @@ module SemanticLogger
|
|
120
120
|
# puts "#{log_struct.metric} was received. Log Struct: #{log_struct.inspect}"
|
121
121
|
# end
|
122
122
|
def self.on_metric(&block)
|
123
|
-
(@@metric_subscribers
|
123
|
+
(@@metric_subscribers ||= ThreadSafe::Array.new) << block
|
124
124
|
end
|
125
125
|
|
126
126
|
############################################################################
|
@@ -146,7 +146,7 @@ module SemanticLogger
|
|
146
146
|
# By default logs to STDERR
|
147
147
|
def self.logger
|
148
148
|
@@logger ||= begin
|
149
|
-
l
|
149
|
+
l = SemanticLogger::Appender::File.new(STDERR, :warn)
|
150
150
|
l.name = name
|
151
151
|
l
|
152
152
|
end
|
@@ -156,7 +156,7 @@ module SemanticLogger
|
|
156
156
|
def self.start_appender_thread
|
157
157
|
return false if appender_thread_active?
|
158
158
|
@@appender_thread = Thread.new { appender_thread }
|
159
|
-
raise
|
159
|
+
raise 'Failed to start Appender Thread' unless @@appender_thread
|
160
160
|
true
|
161
161
|
end
|
162
162
|
|
@@ -173,7 +173,7 @@ module SemanticLogger
|
|
173
173
|
#
|
174
174
|
# Should any appender fail to log or flush, the exception is logged and
|
175
175
|
# other appenders will still be called
|
176
|
-
Thread.current.name =
|
176
|
+
Thread.current.name = 'SemanticLogger::AppenderThread'
|
177
177
|
logger.debug "V#{VERSION} Appender thread active"
|
178
178
|
begin
|
179
179
|
count = 0
|
@@ -208,7 +208,7 @@ module SemanticLogger
|
|
208
208
|
end
|
209
209
|
|
210
210
|
message[:reply_queue] << true if message[:reply_queue]
|
211
|
-
logger.debug
|
211
|
+
logger.debug 'Appender thread: All appenders flushed'
|
212
212
|
else
|
213
213
|
logger.warn "Appender thread: Ignoring unknown command: #{message[:command]}"
|
214
214
|
end
|
@@ -217,7 +217,7 @@ module SemanticLogger
|
|
217
217
|
rescue Exception => exception
|
218
218
|
# This block may be called after the file handles have been released by Ruby
|
219
219
|
begin
|
220
|
-
logger.error
|
220
|
+
logger.error 'Appender thread restarting due to exception', exception
|
221
221
|
rescue Exception
|
222
222
|
nil
|
223
223
|
end
|
@@ -226,7 +226,7 @@ module SemanticLogger
|
|
226
226
|
@@appender_thread = nil
|
227
227
|
# This block may be called after the file handles have been released by Ruby
|
228
228
|
begin
|
229
|
-
logger.debug
|
229
|
+
logger.debug 'Appender thread has stopped'
|
230
230
|
rescue Exception
|
231
231
|
nil
|
232
232
|
end
|
@@ -242,7 +242,7 @@ module SemanticLogger
|
|
242
242
|
begin
|
243
243
|
subscriber.call(log_struct)
|
244
244
|
rescue Exception => exc
|
245
|
-
logger.error
|
245
|
+
logger.error 'Exception calling subscriber', exc
|
246
246
|
end
|
247
247
|
end
|
248
248
|
end
|
@@ -8,16 +8,14 @@ module SemanticLogger
|
|
8
8
|
SemanticLogger::Logger.new(klass)
|
9
9
|
end
|
10
10
|
|
11
|
-
#
|
12
|
-
# This change only applies to _new_ loggers, existing logger levels
|
13
|
-
# will not be changed in any way
|
11
|
+
# Sets the global default log level
|
14
12
|
def self.default_level=(level)
|
15
|
-
@@default_level
|
13
|
+
@@default_level = level
|
16
14
|
# For performance reasons pre-calculate the level index
|
17
15
|
@@default_level_index = level_to_index(level)
|
18
16
|
end
|
19
17
|
|
20
|
-
# Returns the global default log level
|
18
|
+
# Returns the global default log level
|
21
19
|
def self.default_level
|
22
20
|
@@default_level
|
23
21
|
end
|
@@ -80,26 +78,27 @@ module SemanticLogger
|
|
80
78
|
#
|
81
79
|
# logger = SemanticLogger['Example']
|
82
80
|
# logger.info "Hello World"
|
83
|
-
# logger.debug("Login time", :
|
81
|
+
# logger.debug("Login time", user: 'Joe', duration: 100, ip_address: '127.0.0.1')
|
84
82
|
#
|
85
83
|
def self.add_appender(appender, level=nil, &block)
|
86
|
-
appender_instance =
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
84
|
+
appender_instance =
|
85
|
+
if appender.is_a?(String) || appender.is_a?(IO)
|
86
|
+
# $stderr, STDOUT, other IO, or a filename
|
87
|
+
SemanticLogger::Appender::File.new(appender, level, &block)
|
88
|
+
elsif appender.is_a? Appender::Base
|
89
|
+
# Already an instance of an appender
|
90
|
+
appender.level = level if level
|
91
|
+
appender.formatter = block if block
|
92
|
+
appender
|
93
|
+
else
|
94
|
+
# Check if the custom appender responds to all the log levels. For example Ruby ::Logger
|
95
|
+
if does_not_implement = LEVELS[1..-1].find { |i| !appender.respond_to?(i) }
|
96
|
+
raise "Supplied appender does not implement:#{does_not_implement}. It must implement all of #{LEVELS[1..-1].inspect}"
|
97
|
+
end
|
99
98
|
|
100
|
-
|
101
|
-
|
102
|
-
|
99
|
+
raise "Change the log level to #{level}, update the log level directly against the supplied appender" if level
|
100
|
+
SemanticLogger::Appender::Wrapper.new(appender, &block)
|
101
|
+
end
|
103
102
|
@@appenders << appender_instance
|
104
103
|
|
105
104
|
# Start appender thread if it is not already running
|
@@ -133,7 +132,7 @@ module SemanticLogger
|
|
133
132
|
#
|
134
133
|
# Note: Only appenders that implement the reopen method will be called
|
135
134
|
def self.reopen
|
136
|
-
@@appenders.each {|appender| appender.reopen if appender.respond_to?(:reopen)}
|
135
|
+
@@appenders.each { |appender| appender.reopen if appender.respond_to?(:reopen) }
|
137
136
|
# After a fork the appender thread is not running, start it if it is not running
|
138
137
|
SemanticLogger::Logger.start_appender_thread
|
139
138
|
end
|
@@ -189,7 +188,7 @@ module SemanticLogger
|
|
189
188
|
# Set gc_log_microseconds to nil to not enable JRuby Garbage collections
|
190
189
|
def self.add_signal_handler(log_level_signal='USR2', thread_dump_signal='TTIN', gc_log_microseconds=100000)
|
191
190
|
Signal.trap(log_level_signal) do
|
192
|
-
index
|
191
|
+
index = (default_level == :trace) ? LEVELS.find_index(:error) : LEVELS.find_index(default_level)
|
193
192
|
new_level = LEVELS[index-1]
|
194
193
|
self['SemanticLogger'].warn "Changed global default log level to #{new_level.inspect}"
|
195
194
|
self.default_level = new_level
|
@@ -242,27 +241,28 @@ module SemanticLogger
|
|
242
241
|
def self.level_to_index(level)
|
243
242
|
return if level.nil?
|
244
243
|
|
245
|
-
index =
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
244
|
+
index =
|
245
|
+
if level.is_a?(Symbol)
|
246
|
+
LEVELS.index(level)
|
247
|
+
elsif level.is_a?(String)
|
248
|
+
level = level.downcase.to_sym
|
249
|
+
LEVELS.index(level)
|
250
|
+
elsif level.is_a?(Integer) && defined?(::Logger::Severity)
|
251
|
+
# Mapping of Rails and Ruby Logger levels to SemanticLogger levels
|
252
|
+
@@map_levels ||= begin
|
253
|
+
levels = []
|
254
|
+
::Logger::Severity.constants.each do |constant|
|
255
|
+
levels[::Logger::Severity.const_get(constant)] = LEVELS.find_index(constant.downcase.to_sym) || LEVELS.find_index(:error)
|
256
|
+
end
|
257
|
+
levels
|
256
258
|
end
|
257
|
-
|
259
|
+
@@map_levels[level]
|
258
260
|
end
|
259
|
-
@@map_levels[level]
|
260
|
-
end
|
261
261
|
raise "Invalid level:#{level.inspect} being requested. Must be one of #{LEVELS.inspect}" unless index
|
262
262
|
index
|
263
263
|
end
|
264
264
|
|
265
265
|
# Initial default Level for all new instances of SemanticLogger::Logger
|
266
|
-
@@default_level
|
266
|
+
@@default_level = :info
|
267
267
|
@@default_level_index = level_to_index(@@default_level)
|
268
268
|
end
|
@@ -3,14 +3,14 @@ require_relative 'test_helper'
|
|
3
3
|
# Unit Test for SemanticLogger::Appender::Bugsnag
|
4
4
|
#
|
5
5
|
class AppenderBugsnagTest < Minitest::Test
|
6
|
-
|
7
|
-
|
6
|
+
describe SemanticLogger::Appender::Bugsnag do
|
7
|
+
before do
|
8
8
|
@appender = SemanticLogger::Appender::Bugsnag.new(:warn)
|
9
9
|
@message = 'AppenderBugsnagTest log message'
|
10
10
|
end
|
11
11
|
|
12
12
|
(SemanticLogger::LEVELS - [:warn, :error]).each do |level|
|
13
|
-
|
13
|
+
it "not send :#{level} notifications to Bugsnag" do
|
14
14
|
message = hash = nil
|
15
15
|
Bugsnag.stub(:notify, -> msg, h { message = msg; hash = h }) do
|
16
16
|
@appender.send(level, "AppenderBugsnagTest #{level.to_s} message")
|
@@ -20,7 +20,7 @@ class AppenderBugsnagTest < Minitest::Test
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
it "send error notifications to Bugsnag with severity" do
|
24
24
|
message = hash = nil
|
25
25
|
Bugsnag.stub(:notify, -> msg, h { message = msg; hash = h }) do
|
26
26
|
@appender.error @message
|
@@ -29,7 +29,7 @@ class AppenderBugsnagTest < Minitest::Test
|
|
29
29
|
assert_equal 'error', hash[:severity]
|
30
30
|
end
|
31
31
|
|
32
|
-
|
32
|
+
it 'send warn notifications to Bugsnag replace warn severity with warning' do
|
33
33
|
message = hash = nil
|
34
34
|
Bugsnag.stub(:notify, -> msg, h { message = msg; hash = h }) do
|
35
35
|
@appender.warn @message
|
@@ -38,19 +38,19 @@ class AppenderBugsnagTest < Minitest::Test
|
|
38
38
|
assert_equal 'warning', hash[:severity]
|
39
39
|
end
|
40
40
|
|
41
|
-
|
41
|
+
it 'send notification to Bugsnag with custom attributes' do
|
42
42
|
message = hash = nil
|
43
43
|
Bugsnag.stub(:notify, -> msg, h { message = msg; hash = h }) do
|
44
|
-
@appender.error @message, {:
|
44
|
+
@appender.error @message, {key1: 1, key2: 'a'}
|
45
45
|
end
|
46
46
|
assert_equal RuntimeError.new(@message), message
|
47
47
|
assert_equal(1, hash[:key1], hash)
|
48
48
|
assert_equal('a', hash[:key2], hash)
|
49
49
|
end
|
50
50
|
|
51
|
-
|
51
|
+
it 'send notification to Bugsnag with exception' do
|
52
52
|
message = hash = nil
|
53
|
-
error
|
53
|
+
error = RuntimeError.new('Hello World')
|
54
54
|
Bugsnag.stub(:notify, -> msg, h { message = msg; hash = h }) do
|
55
55
|
@appender.error error
|
56
56
|
end
|