semantic_logger 4.3.1 → 4.4.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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/lib/semantic_logger.rb +7 -1
  3. data/lib/semantic_logger/appender.rb +3 -0
  4. data/lib/semantic_logger/appender/async.rb +29 -10
  5. data/lib/semantic_logger/appender/rabbitmq.rb +120 -0
  6. data/lib/semantic_logger/appenders.rb +89 -0
  7. data/lib/semantic_logger/base.rb +3 -3
  8. data/lib/semantic_logger/concerns/compatibility.rb +2 -2
  9. data/lib/semantic_logger/formatters.rb +1 -0
  10. data/lib/semantic_logger/formatters/base.rb +28 -6
  11. data/lib/semantic_logger/formatters/color.rb +4 -3
  12. data/lib/semantic_logger/formatters/fluentd.rb +37 -0
  13. data/lib/semantic_logger/formatters/json.rb +4 -2
  14. data/lib/semantic_logger/formatters/raw.rb +2 -2
  15. data/lib/semantic_logger/formatters/signalfx.rb +4 -3
  16. data/lib/semantic_logger/levels.rb +38 -0
  17. data/lib/semantic_logger/log.rb +11 -6
  18. data/lib/semantic_logger/loggable.rb +1 -1
  19. data/lib/semantic_logger/logger.rb +43 -1
  20. data/lib/semantic_logger/processor.rb +10 -130
  21. data/lib/semantic_logger/reporters/minitest.rb +49 -0
  22. data/lib/semantic_logger/semantic_logger.rb +40 -75
  23. data/lib/semantic_logger/version.rb +1 -1
  24. metadata +9 -81
  25. data/test/appender/async_batch_test.rb +0 -60
  26. data/test/appender/async_test.rb +0 -44
  27. data/test/appender/bugsnag_test.rb +0 -81
  28. data/test/appender/elasticsearch_http_test.rb +0 -74
  29. data/test/appender/elasticsearch_test.rb +0 -248
  30. data/test/appender/file_test.rb +0 -120
  31. data/test/appender/graylog_test.rb +0 -82
  32. data/test/appender/honeybadger_test.rb +0 -45
  33. data/test/appender/http_test.rb +0 -63
  34. data/test/appender/kafka_test.rb +0 -35
  35. data/test/appender/mongodb_test.rb +0 -104
  36. data/test/appender/new_relic_test.rb +0 -80
  37. data/test/appender/newrelic_rpm.rb +0 -14
  38. data/test/appender/sentry_test.rb +0 -47
  39. data/test/appender/splunk_http_test.rb +0 -79
  40. data/test/appender/splunk_test.rb +0 -83
  41. data/test/appender/syslog_test.rb +0 -61
  42. data/test/appender/tcp_test.rb +0 -66
  43. data/test/appender/udp_test.rb +0 -59
  44. data/test/appender/wrapper_test.rb +0 -95
  45. data/test/concerns/compatibility_test.rb +0 -117
  46. data/test/debug_as_trace_logger_test.rb +0 -81
  47. data/test/formatters/color_test.rb +0 -153
  48. data/test/formatters/default_test.rb +0 -175
  49. data/test/formatters/one_line_test.rb +0 -60
  50. data/test/formatters/signalfx_test.rb +0 -197
  51. data/test/formatters_test.rb +0 -36
  52. data/test/in_memory_appender.rb +0 -8
  53. data/test/in_memory_appender_helper.rb +0 -43
  54. data/test/in_memory_batch_appender.rb +0 -8
  55. data/test/in_memory_metrics_appender.rb +0 -13
  56. data/test/loggable_test.rb +0 -103
  57. data/test/logger_test.rb +0 -334
  58. data/test/measure_test.rb +0 -346
  59. data/test/metric/new_relic_test.rb +0 -35
  60. data/test/metric/signalfx_test.rb +0 -77
  61. data/test/semantic_logger_test.rb +0 -303
  62. data/test/test_helper.rb +0 -31
data/test/logger_test.rb DELETED
@@ -1,334 +0,0 @@
1
- require_relative 'test_helper'
2
-
3
- # Unit Test for SemanticLogger::Logger
4
- class LoggerTest < Minitest::Test
5
- describe SemanticLogger::Logger do
6
- include InMemoryAppenderHelper
7
-
8
- let :dimensions do
9
- {action: 'hit', user: 'jbloggs', state: 'FL'}
10
- end
11
-
12
- # Complex filters
13
- module ComplexFilter
14
- def self.call(log)
15
- (/\AExclude/ =~ log.message).nil?
16
- end
17
- end
18
-
19
- # Ensure that any log level can be logged
20
- SemanticLogger::LEVELS.each do |level|
21
- describe "##{level}" do
22
- describe 'positional parameter' do
23
- it 'logs message' do
24
- logger.send(level, 'hello world')
25
-
26
- assert log = log_message
27
- assert_equal 'hello world', log.message
28
- end
29
-
30
- it 'adds message from block' do
31
- logger.send(level, 'hello world') { 'Calculations' }
32
-
33
- assert log = log_message
34
- assert_equal 'hello world -- Calculations', log.message
35
- end
36
-
37
- it 'logs message and payload' do
38
- logger.send(level, 'hello world', payload)
39
-
40
- assert log = log_message
41
- assert_equal 'hello world', log.message
42
- assert_equal payload, log.payload
43
- end
44
-
45
- it 'logs with backtrace' do
46
- SemanticLogger.stub(:backtrace_level_index, 0) do
47
- logger.send(level, 'hello world', payload) { 'Calculations' }
48
-
49
- assert log = log_message
50
- assert_equal 'hello world -- Calculations', log.message
51
- assert_equal payload, log.payload
52
- assert log.backtrace
53
- assert log.backtrace.size.positive?, log.backtrace
54
- end
55
- end
56
-
57
- it 'logs with backtrace and exception' do
58
- SemanticLogger.stub(:backtrace_level_index, 0) do
59
- exc = RuntimeError.new('Test')
60
- logger.send(level, 'hello world', exc)
61
-
62
- assert log = log_message
63
- assert_equal 'hello world', log.message
64
- assert log.backtrace
65
- assert log.backtrace.size.positive?, log.backtrace
66
-
67
- assert log.exception
68
- refute log.exception.backtrace
69
- assert_equal 'RuntimeError', log.exception.class.name
70
- end
71
- end
72
- end
73
-
74
- describe 'keyword arguments' do
75
- it 'logs message' do
76
- logger.send(level, message: 'hello world')
77
-
78
- assert log = log_message
79
- assert_equal 'hello world', log.message
80
- end
81
-
82
- it 'logs payload and message' do
83
- logger.send(level, message: 'hello world', payload: payload)
84
-
85
- assert log = log_message
86
- assert_equal 'hello world', log.message
87
- assert_equal payload, log.payload
88
- end
89
-
90
- it 'logs payload and message from block' do
91
- logger.send(level) { {message: 'hello world', payload: payload} }
92
-
93
- assert log = log_message
94
- assert_equal 'hello world', log.message
95
- assert_equal payload, log.payload
96
- end
97
-
98
- it 'logs payload from block' do
99
- logger.send(level) { {'test_key1' => 'hello world', 'test_key2' => payload} }
100
-
101
- assert log = log_message
102
- assert_equal log.payload, 'test_key1' => 'hello world', 'test_key2' => payload
103
- end
104
-
105
- it 'logs payload only' do
106
- logger.send(level, payload: payload)
107
-
108
- assert log = log_message
109
- refute log.message
110
- assert_equal payload, log.payload
111
- end
112
-
113
- it 'logs duration' do
114
- logger.send(level, duration: 123.44, message: 'hello world', payload: payload)
115
-
116
- assert log = log_message
117
- assert_equal 'hello world', log.message
118
- assert_equal payload, log.payload
119
- assert_equal 123.44, log.duration
120
- end
121
-
122
- it 'does not log when below min_duration' do
123
- logger.send(level, min_duration: 200, duration: 123.45, message: 'hello world', payload: {tracking_number: '123456', even: 2, more: 'data'})
124
-
125
- refute log_message
126
- end
127
-
128
- it 'logs metric' do
129
- metric_name = '/my/custom/metric'
130
- logger.send(level, metric: metric_name, duration: 123.44, message: 'hello world', payload: payload)
131
-
132
- assert log = log_message
133
- assert_equal 'hello world', log.message
134
- assert_equal payload, log.payload
135
- assert_equal 123.44, log.duration
136
- assert_equal metric_name, log.metric
137
- end
138
-
139
- describe 'metrics appender' do
140
- let :appender do
141
- InMemoryMetricsAppender.new
142
- end
143
-
144
- it 'logs metric only events' do
145
- metric_name = '/my/custom/metric'
146
- logger.send(level, metric: metric_name, dimensions: dimensions)
147
-
148
- assert log = log_message
149
- assert_equal metric_name, log.metric
150
- assert_equal dimensions, log.dimensions
151
- refute log.message
152
- end
153
- end
154
-
155
- it 'for compatibility handles random payload logged as keyword arguments' do
156
- logger.send(level, payload)
157
-
158
- assert log = log_message
159
- refute log.message
160
- refute log.exception
161
- refute log.metric
162
- assert_equal payload, log.payload
163
- end
164
- end
165
-
166
- describe '#filter' do
167
- describe 'at the appender level' do
168
- it 'Proc' do
169
- appender.filter = ->(log) { (/\AExclude/ =~ log.message).nil? }
170
- logger.send(level, 'Exclude this log message', @hash) { 'Calculations' }
171
-
172
- refute log_message
173
- end
174
-
175
- it 'Module' do
176
- appender.filter = ComplexFilter
177
- logger.send(level, 'Exclude this log message', @hash) { 'Calculations' }
178
-
179
- refute log_message
180
- end
181
-
182
- it 'RegExp' do
183
- filter = /\ALogger/
184
- appender.filter = ->(log) { (/\AExclude/ =~ log.message).nil? }
185
- logger.send(level, 'Exclude this log message', @hash) { 'Calculations' }
186
-
187
- refute log_message
188
- end
189
- end
190
-
191
- describe 'at the logger level' do
192
- it 'Proc' do
193
- logger.filter = ->(log) { (/\AExclude/ =~ log.message).nil? }
194
- logger.send(level, 'Exclude this log message', @hash) { 'Calculations' }
195
-
196
- refute log_message
197
- end
198
-
199
- it 'Module' do
200
- logger.filter = ComplexFilter
201
- logger.send(level, 'Exclude this log message', @hash) { 'Calculations' }
202
-
203
- refute log_message
204
- end
205
-
206
- it 'RegExp' do
207
- filter = /\ALogger/
208
- logger.filter = ->(log) { (/\AExclude/ =~ log.message).nil? }
209
- logger.send(level, 'Exclude this log message', @hash) { 'Calculations' }
210
-
211
- refute log_message
212
- end
213
- end
214
- end
215
- end
216
- end
217
-
218
- describe 'when level is too high' do
219
- it 'does not log' do
220
- SemanticLogger.default_level = :error
221
- logger.info('Exclude this log message')
222
-
223
- refute log_message
224
- end
225
- end
226
-
227
- describe 'Compatibility' do
228
- # Ensure that any log level can be logged
229
- Logger::Severity.constants.each do |level|
230
- it "log Ruby logger #{level} info" do
231
- logger.level = Logger::Severity.const_get(level)
232
- if level.to_s == 'UNKNOWN'
233
- assert_equal Logger::Severity.const_get('ERROR') + 1, logger.send(:level_index)
234
- else
235
- assert_equal Logger::Severity.const_get(level) + 1, logger.send(:level_index)
236
- end
237
- end
238
- end
239
- end
240
-
241
- describe '#level?' do
242
- it 'return true for debug? with :trace level' do
243
- SemanticLogger.default_level = :trace
244
- assert_equal :trace, logger.level
245
- assert_equal true, logger.debug?
246
- assert_equal true, logger.trace?
247
- end
248
-
249
- it 'return false for debug? with global :debug level' do
250
- SemanticLogger.default_level = :debug
251
- assert_equal :debug, logger.level, logger.inspect
252
- assert_equal true, logger.debug?, logger.inspect
253
- assert_equal false, logger.trace?, logger.inspect
254
- end
255
-
256
- it 'return true for debug? with global :info level' do
257
- SemanticLogger.default_level = :info
258
- assert_equal :info, logger.level, logger.inspect
259
- assert_equal false, logger.debug?, logger.inspect
260
- assert_equal false, logger.trace?, logger.inspect
261
- end
262
-
263
- it 'return false for debug? with instance :debug level' do
264
- logger.level = :debug
265
- assert_equal :debug, logger.level, logger.inspect
266
- assert_equal true, logger.debug?, logger.inspect
267
- assert_equal false, logger.trace?, logger.inspect
268
- end
269
-
270
- it 'return true for debug? with instance :info level' do
271
- logger.level = :info
272
- assert_equal :info, logger.level, logger.inspect
273
- assert_equal false, logger.debug?, logger.inspect
274
- assert_equal false, logger.trace?, logger.inspect
275
- end
276
- end
277
-
278
- describe '.tagged' do
279
- it 'sets global defaults' do
280
- assert_equal [], SemanticLogger.tags
281
- assert_equal 0, SemanticLogger.backtrace_level_index
282
- end
283
-
284
- it 'add tags to log entries' do
285
- logger.tagged('12345', 'DJHSFK') do
286
- logger.info('hello world')
287
-
288
- assert log = log_message
289
- assert_equal 'hello world', log.message
290
- assert_equal %w[12345 DJHSFK], log.tags
291
- end
292
- end
293
-
294
- it 'add embedded tags to log entries' do
295
- logger.tagged('First Level', 'tags') do
296
- logger.tagged('Second Level') do
297
- assert_equal ['First Level', 'tags', 'Second Level'], logger.tags
298
- logger.info('hello world')
299
-
300
- assert log = log_message
301
- assert_equal 'hello world', log.message
302
- assert_equal ['First Level', 'tags', 'Second Level'], log.tags
303
- end
304
- assert_equal ['First Level', 'tags'], logger.tags
305
- end
306
- end
307
-
308
- it 'also supports named tagging' do
309
- logger.tagged(level1: 1) do
310
- assert_equal({level1: 1}, SemanticLogger.named_tags)
311
- assert_equal({level1: 1}, logger.named_tags)
312
- logger.tagged(level2: 2, more: 'data') do
313
- assert_equal({level1: 1, level2: 2, more: 'data'}, SemanticLogger.named_tags)
314
- assert_equal({level1: 1, level2: 2, more: 'data'}, logger.named_tags)
315
- logger.tagged(level3: 3) do
316
- assert_equal({level1: 1, level2: 2, more: 'data', level3: 3}, SemanticLogger.named_tags)
317
- assert_equal({level1: 1, level2: 2, more: 'data', level3: 3}, logger.named_tags)
318
- end
319
- end
320
- end
321
- end
322
-
323
- it 'is compatible with rails logging that uses arrays and nils' do
324
- logger.tagged('', %w[12345 DJHSFK], nil) do
325
- logger.info('hello world')
326
-
327
- assert log = log_message
328
- assert_equal 'hello world', log.message
329
- assert_equal %w[12345 DJHSFK], log.tags
330
- end
331
- end
332
- end
333
- end
334
- end
data/test/measure_test.rb DELETED
@@ -1,346 +0,0 @@
1
- require_relative 'test_helper'
2
-
3
- class MeasureTest < Minitest::Test
4
- describe 'Measure' do
5
- include InMemoryAppenderHelper
6
-
7
- # Ensure that any log level can be measured and logged
8
- SemanticLogger::LEVELS.each do |level|
9
- measure_level = "measure_#{level}".to_sym
10
-
11
- describe "##{measure_level}" do
12
- it ':message' do
13
- assert_equal 'result', logger.send(measure_level, 'hello world') { 'result' }
14
-
15
- assert log = log_message
16
- assert_equal 'hello world', log.message
17
- end
18
-
19
- it ':level' do
20
- assert_equal 'result', logger.send(measure_level, 'hello world') { 'result' }
21
-
22
- assert log = log_message
23
- assert_equal level, log.level
24
- end
25
-
26
- it ':payload' do
27
- assert_equal 'result', logger.send(measure_level, 'hello world', payload: payload) { 'result' }
28
-
29
- assert log = log_message
30
- assert_equal payload, log.payload
31
- end
32
-
33
- describe ':min_duration' do
34
- it 'not log when faster' do
35
- assert_equal 'result', logger.send(measure_level, 'hello world', min_duration: 2000) { 'result' }
36
- refute log_message
37
- end
38
-
39
- it 'log when slower' do
40
- assert_equal 'result', logger.send(measure_level, 'hello world', min_duration: 200, payload: payload) { sleep 0.5; 'result' }
41
-
42
- assert log = log_message
43
- assert_equal 'hello world', log.message
44
- end
45
- end
46
-
47
- it ':exception' do
48
- assert_raises RuntimeError do
49
- logger.send(measure_level, 'hello world', payload: payload) { raise 'Test' }
50
- end
51
-
52
- assert log = log_message
53
- refute log.exception
54
- assert_equal 'hello world -- Exception: RuntimeError: Test', log.message
55
- assert_equal level, log.level
56
- end
57
-
58
- it ':on_exception_level' do
59
- assert_raises RuntimeError do
60
- logger.measure(level, 'hello world', payload: payload, on_exception_level: :fatal) { raise 'Test' }
61
- end
62
-
63
- assert log = log_message
64
- refute log.exception
65
- assert_equal 'hello world -- Exception: RuntimeError: Test', log.message
66
- assert_equal :fatal, log.level
67
- end
68
-
69
- describe 'log_exception' do
70
- it 'default' do
71
- assert_raises RuntimeError do
72
- logger.send(measure_level, 'hello world') { raise 'Test' }
73
- end
74
-
75
- assert log = log_message
76
- refute log.exception
77
- assert_equal 'hello world -- Exception: RuntimeError: Test', log.message
78
- end
79
-
80
- it ':full' do
81
- assert_raises RuntimeError do
82
- logger.send(measure_level, 'hello world', log_exception: :full) { raise 'Test' }
83
- end
84
-
85
- assert log = log_message
86
- assert log.exception.is_a?(RuntimeError)
87
- assert log.exception.backtrace
88
- assert_equal level, log.level
89
- assert_equal 'hello world', log.message
90
- end
91
-
92
- it ':partial' do
93
- assert_raises RuntimeError do
94
- logger.send(measure_level, 'hello world', log_exception: :partial) { raise 'Test' }
95
- end
96
-
97
- assert log = log_message
98
- refute log.exception
99
- assert_equal 'hello world -- Exception: RuntimeError: Test', log.message
100
- end
101
-
102
- it ':none' do
103
- assert_raises RuntimeError do
104
- logger.send(measure_level, 'hello world', log_exception: :none) { raise 'Test' }
105
- end
106
-
107
- assert log = log_message
108
- refute log.exception
109
- assert_equal 'hello world', log.message
110
- end
111
- end
112
-
113
- it ':metric' do
114
- metric_name = '/my/custom/metric'
115
- assert_equal 'result', logger.send(measure_level, 'hello world', metric: metric_name) { 'result' }
116
-
117
- assert log = log_message
118
- assert_equal metric_name, log.metric
119
- end
120
-
121
- it ':backtrace_level' do
122
- SemanticLogger.stub(:backtrace_level_index, 0) do
123
- assert_equal 'result', logger.send(measure_level, 'hello world') { 'result' }
124
-
125
- assert log = log_message
126
- assert log.backtrace
127
- assert log.backtrace.size.positive?
128
-
129
- # Extract file name and line number from backtrace
130
- h = log.to_h
131
- assert_match /measure_test.rb/, h[:file], h
132
- assert h[:line].is_a?(Integer)
133
- end
134
- end
135
- end
136
-
137
- describe "#measure(#{level})" do
138
- it ':message' do
139
- assert_equal 'result', logger.measure(level, 'hello world') { 'result' }
140
-
141
- assert log = log_message
142
- assert_equal 'hello world', log.message
143
- end
144
-
145
- it ':level' do
146
- assert_equal 'result', logger.measure(level, 'hello world') { 'result' }
147
-
148
- assert log = log_message
149
- assert_equal level, log.level
150
- end
151
-
152
- it ':payload' do
153
- assert_equal 'result', logger.measure(level, 'hello world', payload: payload) { 'result' }
154
-
155
- assert log = log_message
156
- assert_equal payload, log.payload
157
- end
158
-
159
- describe ':min_duration' do
160
- it 'not log when faster' do
161
- assert_equal 'result', logger.measure(level, 'hello world', min_duration: 2000) { 'result' }
162
- refute log_message
163
- end
164
-
165
- it 'log when slower' do
166
- assert_equal 'result', logger.measure(level, 'hello world', min_duration: 200, payload: payload) { sleep 0.5; 'result' }
167
- assert log = log_message
168
- assert_equal 'hello world', log.message
169
- end
170
- end
171
-
172
- it ':exception' do
173
- assert_raises RuntimeError do
174
- logger.measure(level, 'hello world', payload: payload) { raise 'Test' }
175
- end
176
-
177
- assert log = log_message
178
- refute log.exception
179
- assert_equal 'hello world -- Exception: RuntimeError: Test', log.message
180
- assert_equal level, log.level
181
- end
182
-
183
- it ':on_exception_level' do
184
- assert_raises RuntimeError do
185
- logger.measure(level, 'hello world', payload: payload, on_exception_level: :fatal) { raise 'Test' }
186
- end
187
-
188
- assert log = log_message
189
- refute log.exception
190
- assert_equal 'hello world -- Exception: RuntimeError: Test', log.message
191
- assert_equal :fatal, log.level
192
- end
193
-
194
- it ':metric' do
195
- metric_name = '/my/custom/metric'
196
- assert_equal 'result', logger.measure(level, 'hello world', metric: metric_name) { 'result' }
197
-
198
- assert log = log_message
199
- assert_equal metric_name, log.metric
200
- end
201
-
202
- it ':backtrace_level' do
203
- SemanticLogger.stub(:backtrace_level_index, 0) do
204
- assert_equal 'result', logger.measure(level, 'hello world') { 'result' }
205
-
206
- assert log = log_message
207
- assert log.backtrace
208
- assert log.backtrace.size.positive?
209
-
210
- # Extract file name and line number from backtrace
211
- h = log.to_h
212
- assert_match /measure_test.rb/, h[:file], h
213
- assert h[:line].is_a?(Integer)
214
- end
215
- end
216
- end
217
-
218
- describe "##{measure_level} keyword arguments" do
219
- it ':message' do
220
- assert_equal 'result', logger.send(measure_level, message: 'hello world') { 'result' }
221
-
222
- assert log = log_message
223
- assert_equal 'hello world', log.message
224
- end
225
-
226
- it ':level' do
227
- assert_equal 'result', logger.send(measure_level, message: 'hello world') { 'result' }
228
-
229
- assert log = log_message
230
- assert_equal level, log.level
231
- end
232
-
233
- it ':payload' do
234
- assert_equal 'result', logger.send(measure_level, message: 'hello world', payload: payload) { 'result' }
235
-
236
- assert log = log_message
237
- assert_equal payload, log.payload
238
- end
239
-
240
- describe ':min_duration' do
241
- it 'not log when faster' do
242
- assert_equal 'result', logger.send(measure_level, message: 'hello world', min_duration: 2000) { 'result' }
243
- refute log_message
244
- end
245
-
246
- it 'log when slower' do
247
- assert_equal 'result', logger.send(measure_level, message: 'hello world', min_duration: 200, payload: payload) { sleep 0.5; 'result' }
248
-
249
- assert log = log_message
250
- assert_equal 'hello world', log.message
251
- end
252
- end
253
-
254
- it ':exception' do
255
- assert_raises RuntimeError do
256
- logger.send(measure_level, message: 'hello world', payload: payload) { raise 'Test' }
257
- end
258
-
259
- assert log = log_message
260
- refute log.exception
261
- assert_equal 'hello world -- Exception: RuntimeError: Test', log.message
262
- assert_equal level, log.level
263
- end
264
-
265
- it ':on_exception_level' do
266
- assert_raises RuntimeError do
267
- logger.send(measure_level, message: 'hello world', payload: payload, on_exception_level: :fatal) { raise 'Test' }
268
- end
269
-
270
- assert log = log_message
271
- refute log.exception
272
- assert_equal 'hello world -- Exception: RuntimeError: Test', log.message
273
- assert_equal :fatal, log.level
274
- end
275
-
276
- it ':metric' do
277
- metric_name = '/my/custom/metric'
278
- assert_equal 'result', logger.send(measure_level, message: 'hello world', metric: metric_name) { 'result' }
279
-
280
- assert log = log_message
281
- assert_equal metric_name, log.metric
282
- end
283
-
284
- it ':backtrace_level' do
285
- SemanticLogger.stub(:backtrace_level_index, 0) do
286
- assert_equal 'result', logger.send(measure_level, message: 'hello world') { 'result' }
287
-
288
- assert log = log_message
289
- assert log.backtrace
290
- assert log.backtrace.size.positive?
291
-
292
- # Extract file name and line number from backtrace
293
- h = log.to_h
294
- assert_match /measure_test.rb/, h[:file], h
295
- assert h[:line].is_a?(Integer)
296
- end
297
- end
298
- end
299
- end
300
-
301
- describe 'return' do
302
- it 'log when the block performs a return' do
303
- assert_equal 'Good', function_with_return(logger)
304
-
305
- assert log = log_message
306
- assert_equal 'hello world', log.message
307
- end
308
- end
309
-
310
- describe ':silence' do
311
- it 'silences messages' do
312
- SemanticLogger.default_level = :info
313
- logger.measure_info('hello world', silence: :error) do
314
- logger.warn "don't log me"
315
- end
316
-
317
- assert log = log_message
318
- assert_equal 'hello world', log.message
319
- end
320
-
321
- it 'does not silence higher level messages' do
322
- SemanticLogger.default_level = :info
323
- first = nil
324
- logger.measure_info('hello world', silence: :trace) do
325
- logger.debug('hello world', payload) { 'Calculations' }
326
- first = log_message
327
- end
328
- assert_equal 'hello world -- Calculations', first.message
329
- assert_equal payload, first.payload
330
-
331
- SemanticLogger.flush
332
- assert log = appender.message
333
- assert_equal 'hello world', log.message
334
- end
335
- end
336
-
337
- # Make sure that measure still logs when a block uses return to return from
338
- # a function
339
- def function_with_return(logger)
340
- logger.measure_info('hello world', payload: payload) do
341
- return 'Good'
342
- end
343
- 'Bad'
344
- end
345
- end
346
- end