semantic_logger 3.2.1 → 3.3.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 +1 -1
- data/lib/semantic_logger.rb +22 -2
- data/lib/semantic_logger/appender/bugsnag.rb +2 -2
- data/lib/semantic_logger/appender/elasticsearch.rb +9 -1
- data/lib/semantic_logger/appender/file.rb +1 -1
- data/lib/semantic_logger/appender/graylog.rb +18 -21
- data/lib/semantic_logger/appender/honeybadger.rb +27 -12
- data/lib/semantic_logger/appender/http.rb +19 -11
- data/lib/semantic_logger/appender/mongodb.rb +23 -30
- data/lib/semantic_logger/appender/new_relic.rb +2 -2
- data/lib/semantic_logger/appender/splunk.rb +32 -21
- data/lib/semantic_logger/appender/splunk_http.rb +1 -3
- data/lib/semantic_logger/appender/syslog.rb +25 -10
- data/lib/semantic_logger/appender/tcp.rb +231 -0
- data/lib/semantic_logger/appender/udp.rb +106 -0
- data/lib/semantic_logger/appender/wrapper.rb +1 -1
- data/lib/semantic_logger/base.rb +9 -3
- data/lib/semantic_logger/formatters/base.rb +36 -0
- data/lib/semantic_logger/formatters/color.rb +13 -10
- data/lib/semantic_logger/formatters/default.rb +8 -5
- data/lib/semantic_logger/formatters/json.rb +10 -3
- data/lib/semantic_logger/formatters/raw.rb +13 -0
- data/lib/semantic_logger/formatters/syslog.rb +119 -0
- data/lib/semantic_logger/log.rb +7 -5
- data/lib/semantic_logger/loggable.rb +5 -0
- data/lib/semantic_logger/logger.rb +45 -10
- data/lib/semantic_logger/metrics/new_relic.rb +1 -1
- data/lib/semantic_logger/metrics/statsd.rb +5 -1
- data/lib/semantic_logger/metrics/udp.rb +80 -0
- data/lib/semantic_logger/semantic_logger.rb +23 -27
- data/lib/semantic_logger/subscriber.rb +127 -0
- data/lib/semantic_logger/version.rb +1 -1
- data/test/appender/elasticsearch_test.rb +6 -4
- data/test/appender/file_test.rb +12 -12
- data/test/appender/honeybadger_test.rb +7 -1
- data/test/appender/http_test.rb +4 -2
- data/test/appender/mongodb_test.rb +1 -2
- data/test/appender/splunk_http_test.rb +8 -6
- data/test/appender/splunk_test.rb +48 -45
- data/test/appender/syslog_test.rb +3 -3
- data/test/appender/tcp_test.rb +68 -0
- data/test/appender/udp_test.rb +61 -0
- data/test/appender/wrapper_test.rb +5 -5
- data/test/concerns/compatibility_test.rb +6 -6
- data/test/debug_as_trace_logger_test.rb +2 -2
- data/test/loggable_test.rb +2 -2
- data/test/logger_test.rb +48 -45
- metadata +13 -3
- data/lib/semantic_logger/appender/base.rb +0 -101
data/test/logger_test.rb
CHANGED
@@ -4,9 +4,13 @@ require_relative 'test_helper'
|
|
4
4
|
class LoggerTest < Minitest::Test
|
5
5
|
describe SemanticLogger::Logger do
|
6
6
|
describe '.add_appender' do
|
7
|
+
before do
|
8
|
+
@appender = nil
|
9
|
+
end
|
10
|
+
|
7
11
|
after do
|
8
|
-
SemanticLogger.remove_appender(@appender)
|
9
|
-
File.delete('sample.log') if File.
|
12
|
+
SemanticLogger.remove_appender(@appender)
|
13
|
+
File.delete('sample.log') if File.exist?('sample.log')
|
10
14
|
end
|
11
15
|
|
12
16
|
it 'adds file appender' do
|
@@ -30,8 +34,8 @@ class LoggerTest < Minitest::Test
|
|
30
34
|
end
|
31
35
|
|
32
36
|
it 'adds symbol appender' do
|
33
|
-
@appender = SemanticLogger.add_appender(appender: :
|
34
|
-
assert @appender.is_a?(SemanticLogger::Appender::
|
37
|
+
@appender = SemanticLogger.add_appender(appender: :wrapper, logger: Logger.new(STDOUT))
|
38
|
+
assert @appender.is_a?(SemanticLogger::Appender::Wrapper), @appender.ai
|
35
39
|
assert SemanticLogger.appenders.include?(@appender)
|
36
40
|
end
|
37
41
|
|
@@ -52,8 +56,8 @@ class LoggerTest < Minitest::Test
|
|
52
56
|
end
|
53
57
|
|
54
58
|
it 'adds appender' do
|
55
|
-
@appender = SemanticLogger.add_appender(appender: SemanticLogger::Appender::
|
56
|
-
assert @appender.is_a?(SemanticLogger::Appender::
|
59
|
+
@appender = SemanticLogger.add_appender(appender: SemanticLogger::Appender::File.new(io: STDOUT))
|
60
|
+
assert @appender.is_a?(SemanticLogger::Appender::File), @appender.ai
|
57
61
|
assert SemanticLogger.appenders.include?(@appender)
|
58
62
|
end
|
59
63
|
|
@@ -67,7 +71,7 @@ class LoggerTest < Minitest::Test
|
|
67
71
|
describe '.add_appender DEPRECATED' do
|
68
72
|
after do
|
69
73
|
SemanticLogger.remove_appender(@appender) if @appender
|
70
|
-
File.delete('sample.log') if File.
|
74
|
+
File.delete('sample.log') if File.exist?('sample.log')
|
71
75
|
end
|
72
76
|
|
73
77
|
it 'adds file appender' do
|
@@ -83,8 +87,8 @@ class LoggerTest < Minitest::Test
|
|
83
87
|
end
|
84
88
|
|
85
89
|
it 'adds appender' do
|
86
|
-
@appender = SemanticLogger.add_appender(SemanticLogger::Appender::
|
87
|
-
assert @appender.is_a?(SemanticLogger::Appender::
|
90
|
+
@appender = SemanticLogger.add_appender(SemanticLogger::Appender::File.new(io: STDOUT))
|
91
|
+
assert @appender.is_a?(SemanticLogger::Appender::File), @appender.ai
|
88
92
|
assert SemanticLogger.appenders.include?(@appender)
|
89
93
|
end
|
90
94
|
|
@@ -143,7 +147,7 @@ class LoggerTest < Minitest::Test
|
|
143
147
|
it 'logs' do
|
144
148
|
@logger.send(level, 'hello world', @hash) { 'Calculations' }
|
145
149
|
SemanticLogger.flush
|
146
|
-
assert_match
|
150
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] LoggerTest -- hello world -- Calculations -- #{@hash_str}/, @mock_logger.message)
|
147
151
|
end
|
148
152
|
|
149
153
|
it 'exclude log messages using Proc filter' do
|
@@ -167,7 +171,7 @@ class LoggerTest < Minitest::Test
|
|
167
171
|
SemanticLogger.stub(:backtrace_level_index, 0) do
|
168
172
|
@logger.send(level, 'hello world', @hash) { 'Calculations' }
|
169
173
|
SemanticLogger.flush
|
170
|
-
assert_match
|
174
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}#{@file_name_reg_exp}\] LoggerTest -- hello world -- Calculations -- #{@hash_str}/, @mock_logger.message)
|
171
175
|
end
|
172
176
|
end
|
173
177
|
|
@@ -176,7 +180,7 @@ class LoggerTest < Minitest::Test
|
|
176
180
|
exc = RuntimeError.new("Test")
|
177
181
|
@logger.send(level, 'hello world', exc)
|
178
182
|
SemanticLogger.flush
|
179
|
-
assert_match
|
183
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}#{@file_name_reg_exp}\] LoggerTest -- hello world -- Exception: RuntimeError: Test/, @mock_logger.message)
|
180
184
|
end
|
181
185
|
end
|
182
186
|
|
@@ -185,21 +189,21 @@ class LoggerTest < Minitest::Test
|
|
185
189
|
hash_str = hash.inspect.sub('{', '\{').sub('}', '\}')
|
186
190
|
@logger.send(level, 'Hello world', hash)
|
187
191
|
SemanticLogger.flush
|
188
|
-
assert_match
|
192
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] LoggerTest -- Hello world -- #{hash_str}/, @mock_logger.message)
|
189
193
|
end
|
190
194
|
|
191
195
|
it 'does not log an empty payload' do
|
192
196
|
hash = {}
|
193
197
|
@logger.send(level, 'Hello world', hash)
|
194
198
|
SemanticLogger.flush
|
195
|
-
assert_match
|
199
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] LoggerTest -- Hello world/, @mock_logger.message)
|
196
200
|
end
|
197
201
|
|
198
202
|
describe 'hash only argument' do
|
199
203
|
it 'logs message' do
|
200
204
|
@logger.send(level, message: 'Hello world')
|
201
205
|
SemanticLogger.flush
|
202
|
-
assert_match
|
206
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] LoggerTest -- Hello world/, @mock_logger.message)
|
203
207
|
end
|
204
208
|
|
205
209
|
it 'logs payload and message' do
|
@@ -207,7 +211,7 @@ class LoggerTest < Minitest::Test
|
|
207
211
|
hash = {tracking_number: '123456', even: 2, more: 'data'}
|
208
212
|
SemanticLogger.flush
|
209
213
|
hash_str = hash.inspect.sub('{', '\{').sub('}', '\}')
|
210
|
-
assert_match
|
214
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] LoggerTest -- Hello world -- #{hash_str}/, @mock_logger.message)
|
211
215
|
end
|
212
216
|
|
213
217
|
it 'logs payload and message from block' do
|
@@ -215,7 +219,7 @@ class LoggerTest < Minitest::Test
|
|
215
219
|
hash = {tracking_number: '123456', even: 2, more: 'data'}
|
216
220
|
SemanticLogger.flush
|
217
221
|
hash_str = hash.inspect.sub('{', '\{').sub('}', '\}')
|
218
|
-
assert_match
|
222
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] LoggerTest -- Hello world -- #{hash_str}/, @mock_logger.message)
|
219
223
|
end
|
220
224
|
|
221
225
|
it 'logs payload only' do
|
@@ -223,7 +227,7 @@ class LoggerTest < Minitest::Test
|
|
223
227
|
@logger.send(level, hash)
|
224
228
|
SemanticLogger.flush
|
225
229
|
hash_str = hash.inspect.sub('{', '\{').sub('}', '\}')
|
226
|
-
assert_match
|
230
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] LoggerTest -- #{hash_str}/, @mock_logger.message)
|
227
231
|
end
|
228
232
|
|
229
233
|
it 'logs duration' do
|
@@ -232,12 +236,11 @@ class LoggerTest < Minitest::Test
|
|
232
236
|
SemanticLogger.flush
|
233
237
|
hash_str = hash.inspect.sub('{', '\{').sub('}', '\}')
|
234
238
|
duration_match = defined?(JRuby) ? '\(123ms\)' : '\(123\.5ms\)'
|
235
|
-
assert_match
|
239
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] #{duration_match} LoggerTest -- Hello world -- #{hash_str}/, @mock_logger.message)
|
236
240
|
end
|
237
241
|
|
238
242
|
it 'does not log when below min_duration' do
|
239
243
|
@logger.send(level, min_duration: 200, duration: 123.45, message: 'Hello world', tracking_number: '123456', even: 2, more: 'data')
|
240
|
-
hash = {tracking_number: '123456', even: 2, more: 'data'}
|
241
244
|
SemanticLogger.flush
|
242
245
|
assert_nil @mock_logger.message
|
243
246
|
end
|
@@ -249,7 +252,7 @@ class LoggerTest < Minitest::Test
|
|
249
252
|
SemanticLogger.flush
|
250
253
|
hash_str = hash.inspect.sub('{', '\{').sub('}', '\}')
|
251
254
|
duration_match = defined?(JRuby) ? '\(123ms\)' : '\(123\.5ms\)'
|
252
|
-
assert_match
|
255
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] #{duration_match} LoggerTest -- Hello world -- #{hash_str}/, @mock_logger.message)
|
253
256
|
assert metric_name, $last_metric.metric
|
254
257
|
end
|
255
258
|
|
@@ -263,7 +266,7 @@ class LoggerTest < Minitest::Test
|
|
263
266
|
@logger.tagged('12345', 'DJHSFK') do
|
264
267
|
@logger.info('Hello world')
|
265
268
|
SemanticLogger.flush
|
266
|
-
assert_match
|
269
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:#{@thread_name}\] \[12345\] \[DJHSFK\] LoggerTest -- Hello world/, @mock_logger.message)
|
267
270
|
end
|
268
271
|
end
|
269
272
|
|
@@ -272,7 +275,7 @@ class LoggerTest < Minitest::Test
|
|
272
275
|
@logger.tagged('Second Level') do
|
273
276
|
@logger.info('Hello world')
|
274
277
|
SemanticLogger.flush
|
275
|
-
assert_match
|
278
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:#{@thread_name}\] \[First Level\] \[tags\] \[Second Level\] LoggerTest -- Hello world/, @mock_logger.message)
|
276
279
|
end
|
277
280
|
assert_equal 2, @logger.tags.count, @logger.tags
|
278
281
|
assert_equal 'First Level', @logger.tags.first
|
@@ -289,7 +292,7 @@ class LoggerTest < Minitest::Test
|
|
289
292
|
@logger.with_payload(even: 2, more: 'data') do
|
290
293
|
@logger.info('Hello world')
|
291
294
|
SemanticLogger.flush
|
292
|
-
assert_match
|
295
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:#{@thread_name}\] LoggerTest -- Hello world -- #{hash_str}/, @mock_logger.message)
|
293
296
|
end
|
294
297
|
end
|
295
298
|
end
|
@@ -300,7 +303,7 @@ class LoggerTest < Minitest::Test
|
|
300
303
|
@logger.fast_tag('12345') do
|
301
304
|
@logger.info('Hello world')
|
302
305
|
SemanticLogger.flush
|
303
|
-
assert_match
|
306
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:#{@thread_name}\] \[12345\] LoggerTest -- Hello world/, @mock_logger.message)
|
304
307
|
end
|
305
308
|
end
|
306
309
|
end
|
@@ -328,13 +331,13 @@ class LoggerTest < Minitest::Test
|
|
328
331
|
it "log #{level} info" do
|
329
332
|
assert_equal 'result', @logger.send("measure_#{level}".to_sym, 'hello world') { 'result' } # Measure duration of the supplied block
|
330
333
|
SemanticLogger.flush
|
331
|
-
assert_match
|
334
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world/, @mock_logger.message)
|
332
335
|
end
|
333
336
|
|
334
337
|
it "log #{level} info with payload" do
|
335
338
|
assert_equal 'result', @logger.send("measure_#{level}".to_sym, 'hello world', payload: @hash) { 'result' } # Measure duration of the supplied block
|
336
339
|
SemanticLogger.flush
|
337
|
-
assert_match
|
340
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world -- #{@hash_str}/, @mock_logger.message)
|
338
341
|
end
|
339
342
|
|
340
343
|
it "not log #{level} info when block is faster than :min_duration" do
|
@@ -346,7 +349,7 @@ class LoggerTest < Minitest::Test
|
|
346
349
|
it "log #{level} info when block duration exceeds :min_duration" do
|
347
350
|
assert_equal 'result', @logger.send("measure_#{level}".to_sym, 'hello world', min_duration: 200, payload: @hash) { sleep 0.5; 'result' } # Measure duration of the supplied block
|
348
351
|
SemanticLogger.flush
|
349
|
-
assert_match
|
352
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world -- #{@hash_str}/, @mock_logger.message)
|
350
353
|
end
|
351
354
|
|
352
355
|
it "log #{level} info with an exception" do
|
@@ -354,7 +357,7 @@ class LoggerTest < Minitest::Test
|
|
354
357
|
@logger.send("measure_#{level}", 'hello world', payload: @hash) { raise RuntimeError.new("Test") } # Measure duration of the supplied block
|
355
358
|
end
|
356
359
|
SemanticLogger.flush
|
357
|
-
assert_match
|
360
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}#{@file_name_reg_exp}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world -- Exception: RuntimeError: Test -- #{@hash_str}/, @mock_logger.message)
|
358
361
|
end
|
359
362
|
|
360
363
|
it "change log #{level} info with an exception" do
|
@@ -362,14 +365,14 @@ class LoggerTest < Minitest::Test
|
|
362
365
|
@logger.send("measure_#{level}", 'hello world', payload: @hash, on_exception_level: :fatal) { raise RuntimeError.new("Test") } # Measure duration of the supplied block
|
363
366
|
end
|
364
367
|
SemanticLogger.flush
|
365
|
-
assert_match
|
368
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ F \[\d+:#{@thread_name}#{@file_name_reg_exp}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world -- Exception: RuntimeError: Test -- #{@hash_str}/, @mock_logger.message)
|
366
369
|
end
|
367
370
|
|
368
371
|
it "log #{level} info with metric" do
|
369
372
|
metric_name = '/my/custom/metric'
|
370
373
|
assert_equal 'result', @logger.send("measure_#{level}".to_sym, 'hello world', metric: metric_name) { 'result' } # Measure duration of the supplied block
|
371
374
|
SemanticLogger.flush
|
372
|
-
assert_match
|
375
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world/, @mock_logger.message)
|
373
376
|
assert metric_name, $last_metric.metric
|
374
377
|
end
|
375
378
|
|
@@ -377,7 +380,7 @@ class LoggerTest < Minitest::Test
|
|
377
380
|
SemanticLogger.stub(:backtrace_level_index, 0) do
|
378
381
|
assert_equal 'result', @logger.send("measure_#{level}".to_sym, 'hello world') { 'result' }
|
379
382
|
SemanticLogger.flush
|
380
|
-
assert_match
|
383
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}#{@file_name_reg_exp}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world/, @mock_logger.message)
|
381
384
|
end
|
382
385
|
end
|
383
386
|
end
|
@@ -386,13 +389,13 @@ class LoggerTest < Minitest::Test
|
|
386
389
|
it "log #{level} info" do
|
387
390
|
assert_equal 'result', @logger.measure(level, 'hello world') { 'result' } # Measure duration of the supplied block
|
388
391
|
SemanticLogger.flush
|
389
|
-
assert_match
|
392
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world/, @mock_logger.message)
|
390
393
|
end
|
391
394
|
|
392
395
|
it "log #{level} info with payload" do
|
393
396
|
assert_equal 'result', @logger.measure(level, 'hello world', payload: @hash) { 'result' } # Measure duration of the supplied block
|
394
397
|
SemanticLogger.flush
|
395
|
-
assert_match
|
398
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world -- #{@hash_str}/, @mock_logger.message)
|
396
399
|
end
|
397
400
|
|
398
401
|
it "not log #{level} info when block is faster than :min_duration" do
|
@@ -404,7 +407,7 @@ class LoggerTest < Minitest::Test
|
|
404
407
|
it "log #{level} info when block duration exceeds :min_duration" do
|
405
408
|
assert_equal 'result', @logger.measure(level, 'hello world', min_duration: 200, payload: @hash) { sleep 0.5; 'result' } # Measure duration of the supplied block
|
406
409
|
SemanticLogger.flush
|
407
|
-
assert_match
|
410
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world -- #{@hash_str}/, @mock_logger.message)
|
408
411
|
end
|
409
412
|
|
410
413
|
it "log #{level} info with an exception" do
|
@@ -412,14 +415,14 @@ class LoggerTest < Minitest::Test
|
|
412
415
|
@logger.measure(level, 'hello world', payload: @hash) { raise RuntimeError.new('Test') } # Measure duration of the supplied block
|
413
416
|
end
|
414
417
|
SemanticLogger.flush
|
415
|
-
assert_match
|
418
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}#{@file_name_reg_exp}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world -- Exception: RuntimeError: Test -- #{@hash_str}/, @mock_logger.message)
|
416
419
|
end
|
417
420
|
|
418
421
|
it "log #{level} info with metric" do
|
419
422
|
metric_name = '/my/custom/metric'
|
420
423
|
assert_equal 'result', @logger.measure(level, 'hello world', metric: metric_name) { 'result' } # Measure duration of the supplied block
|
421
424
|
SemanticLogger.flush
|
422
|
-
assert_match
|
425
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world/, @mock_logger.message)
|
423
426
|
assert metric_name, $last_metric.metric
|
424
427
|
end
|
425
428
|
|
@@ -427,7 +430,7 @@ class LoggerTest < Minitest::Test
|
|
427
430
|
SemanticLogger.stub(:backtrace_level_index, 0) do
|
428
431
|
assert_equal 'result', @logger.measure(level, 'hello world') { 'result' }
|
429
432
|
SemanticLogger.flush
|
430
|
-
assert_match
|
433
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}#{@file_name_reg_exp}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world/, @mock_logger.message)
|
431
434
|
end
|
432
435
|
end
|
433
436
|
end
|
@@ -436,7 +439,7 @@ class LoggerTest < Minitest::Test
|
|
436
439
|
it 'log when the block performs a return' do
|
437
440
|
assert_equal 'Good', function_with_return(@logger)
|
438
441
|
SemanticLogger.flush
|
439
|
-
assert_match
|
442
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:#{@thread_name}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world -- #{@hash_str}/, @mock_logger.message)
|
440
443
|
end
|
441
444
|
|
442
445
|
it 'not log at a level below the silence level' do
|
@@ -445,7 +448,7 @@ class LoggerTest < Minitest::Test
|
|
445
448
|
@logger.warn "don't log me"
|
446
449
|
end
|
447
450
|
SemanticLogger.flush
|
448
|
-
assert_match
|
451
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:#{@thread_name}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world/, @mock_logger.message)
|
449
452
|
end
|
450
453
|
|
451
454
|
it 'log at a silence level below the default level' do
|
@@ -456,10 +459,10 @@ class LoggerTest < Minitest::Test
|
|
456
459
|
SemanticLogger.flush
|
457
460
|
first_message = @mock_logger.message
|
458
461
|
end
|
459
|
-
assert_match
|
462
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ D \[\d+:#{@thread_name}\] LoggerTest -- hello world -- Calculations -- #{@hash_str}/, first_message)
|
460
463
|
SemanticLogger.flush
|
461
464
|
# Only the last log message is kept in mock logger
|
462
|
-
assert_match
|
465
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:#{@thread_name}\] \((\d+\.\d+)|(\d+)ms\) LoggerTest -- hello world/, @mock_logger.message)
|
463
466
|
end
|
464
467
|
end
|
465
468
|
|
@@ -482,7 +485,7 @@ class LoggerTest < Minitest::Test
|
|
482
485
|
assert_equal :trace, @logger.level
|
483
486
|
@logger.trace('hello world', @hash) { 'Calculations' }
|
484
487
|
SemanticLogger.flush
|
485
|
-
assert_match
|
488
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ T \[\d+:#{@thread_name}\] LoggerTest -- hello world -- Calculations -- #{@hash_str}/, @mock_logger.message)
|
486
489
|
end
|
487
490
|
|
488
491
|
it 'not log at a level below the instance level' do
|
@@ -520,7 +523,7 @@ class LoggerTest < Minitest::Test
|
|
520
523
|
@logger.trace('hello world', @hash) { 'Calculations' }
|
521
524
|
end
|
522
525
|
SemanticLogger.flush
|
523
|
-
assert_match
|
526
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ T \[\d+:#{@thread_name}\] LoggerTest -- hello world -- Calculations -- #{@hash_str}/, @mock_logger.message)
|
524
527
|
end
|
525
528
|
|
526
529
|
it 'log at a silence level below the default level' do
|
@@ -530,7 +533,7 @@ class LoggerTest < Minitest::Test
|
|
530
533
|
@logger.debug('hello world', @hash) { 'Calculations' }
|
531
534
|
end
|
532
535
|
SemanticLogger.flush
|
533
|
-
assert_match
|
536
|
+
assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ D \[\d+:#{@thread_name}\] LoggerTest -- hello world -- Calculations -- #{@hash_str}/, @mock_logger.message)
|
534
537
|
end
|
535
538
|
end
|
536
539
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: semantic_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Morrison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -37,7 +37,6 @@ files:
|
|
37
37
|
- Rakefile
|
38
38
|
- lib/semantic_logger.rb
|
39
39
|
- lib/semantic_logger/ansi_colors.rb
|
40
|
-
- lib/semantic_logger/appender/base.rb
|
41
40
|
- lib/semantic_logger/appender/bugsnag.rb
|
42
41
|
- lib/semantic_logger/appender/elasticsearch.rb
|
43
42
|
- lib/semantic_logger/appender/file.rb
|
@@ -49,21 +48,28 @@ files:
|
|
49
48
|
- lib/semantic_logger/appender/splunk.rb
|
50
49
|
- lib/semantic_logger/appender/splunk_http.rb
|
51
50
|
- lib/semantic_logger/appender/syslog.rb
|
51
|
+
- lib/semantic_logger/appender/tcp.rb
|
52
|
+
- lib/semantic_logger/appender/udp.rb
|
52
53
|
- lib/semantic_logger/appender/wrapper.rb
|
53
54
|
- lib/semantic_logger/base.rb
|
54
55
|
- lib/semantic_logger/concerns/compatibility.rb
|
55
56
|
- lib/semantic_logger/core_ext/thread.rb
|
56
57
|
- lib/semantic_logger/debug_as_trace_logger.rb
|
58
|
+
- lib/semantic_logger/formatters/base.rb
|
57
59
|
- lib/semantic_logger/formatters/color.rb
|
58
60
|
- lib/semantic_logger/formatters/default.rb
|
59
61
|
- lib/semantic_logger/formatters/json.rb
|
62
|
+
- lib/semantic_logger/formatters/raw.rb
|
63
|
+
- lib/semantic_logger/formatters/syslog.rb
|
60
64
|
- lib/semantic_logger/jruby/garbage_collection_logger.rb
|
61
65
|
- lib/semantic_logger/log.rb
|
62
66
|
- lib/semantic_logger/loggable.rb
|
63
67
|
- lib/semantic_logger/logger.rb
|
64
68
|
- lib/semantic_logger/metrics/new_relic.rb
|
65
69
|
- lib/semantic_logger/metrics/statsd.rb
|
70
|
+
- lib/semantic_logger/metrics/udp.rb
|
66
71
|
- lib/semantic_logger/semantic_logger.rb
|
72
|
+
- lib/semantic_logger/subscriber.rb
|
67
73
|
- lib/semantic_logger/version.rb
|
68
74
|
- test/appender/bugsnag_test.rb
|
69
75
|
- test/appender/elasticsearch_test.rb
|
@@ -77,6 +83,8 @@ files:
|
|
77
83
|
- test/appender/splunk_http_test.rb
|
78
84
|
- test/appender/splunk_test.rb
|
79
85
|
- test/appender/syslog_test.rb
|
86
|
+
- test/appender/tcp_test.rb
|
87
|
+
- test/appender/udp_test.rb
|
80
88
|
- test/appender/wrapper_test.rb
|
81
89
|
- test/concerns/compatibility_test.rb
|
82
90
|
- test/debug_as_trace_logger_test.rb
|
@@ -121,6 +129,8 @@ test_files:
|
|
121
129
|
- test/appender/splunk_http_test.rb
|
122
130
|
- test/appender/splunk_test.rb
|
123
131
|
- test/appender/syslog_test.rb
|
132
|
+
- test/appender/tcp_test.rb
|
133
|
+
- test/appender/udp_test.rb
|
124
134
|
- test/appender/wrapper_test.rb
|
125
135
|
- test/concerns/compatibility_test.rb
|
126
136
|
- test/debug_as_trace_logger_test.rb
|
@@ -1,101 +0,0 @@
|
|
1
|
-
# Base appender
|
2
|
-
#
|
3
|
-
# Abstract base class for appenders
|
4
|
-
#
|
5
|
-
# Implements common behavior such as default text formatter etc
|
6
|
-
#
|
7
|
-
# Note: Do not create instances of this class directly
|
8
|
-
#
|
9
|
-
module SemanticLogger
|
10
|
-
module Appender
|
11
|
-
|
12
|
-
# DEPRECATED, use SemanticLogger::AnsiColors
|
13
|
-
AnsiColors = SemanticLogger::AnsiColors
|
14
|
-
|
15
|
-
class Base < SemanticLogger::Base
|
16
|
-
# Every logger has its own formatter
|
17
|
-
attr_accessor :formatter
|
18
|
-
|
19
|
-
# Returns the current log level if set, otherwise it logs everything it receives
|
20
|
-
def level
|
21
|
-
@level || :trace
|
22
|
-
end
|
23
|
-
|
24
|
-
# An appender can implement a flush method if it is able to.
|
25
|
-
def flush
|
26
|
-
# NOOP
|
27
|
-
end
|
28
|
-
|
29
|
-
# DEPRECATED: use SemanticLogger::Formatters::Default.new
|
30
|
-
def default_formatter
|
31
|
-
warn '[DEPRECATION] SemanticLogger::Appender::Base.default_level is deprecated. Please use SemanticLogger::Formatters::Default.new instead.'
|
32
|
-
formatter = SemanticLogger::Formatters::Default.new
|
33
|
-
Proc.new { |log, logger| formatter.call(log, logger) }
|
34
|
-
end
|
35
|
-
|
36
|
-
# DEPRECATED: use SemanticLogger::Formatters::Color.new
|
37
|
-
def self.colorized_formatter
|
38
|
-
warn '[DEPRECATION] SemanticLogger::Appender::Base.colorized_formatter is deprecated. Please use SemanticLogger::Formatters::Color.new instead.'
|
39
|
-
formatter = SemanticLogger::Formatters::Color.new
|
40
|
-
Proc.new { |log, logger| formatter.call(log, logger) }
|
41
|
-
end
|
42
|
-
|
43
|
-
# DEPRECATED: use SemanticLogger::Formatters::Json.new
|
44
|
-
def self.json_formatter
|
45
|
-
warn '[DEPRECATION] SemanticLogger::Appender::Base.json_formatter is deprecated. Please use SemanticLogger::Formatters::Json.new instead.'
|
46
|
-
formatter = SemanticLogger::Formatters::Json.new
|
47
|
-
Proc.new { |log, logger| formatter.call(log, logger) }
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
# Initializer for Abstract Class SemanticLogger::Appender
|
53
|
-
#
|
54
|
-
# Parameters
|
55
|
-
# level: [:trace | :debug | :info | :warn | :error | :fatal]
|
56
|
-
# Override the log level for this appender.
|
57
|
-
# Default: :error
|
58
|
-
#
|
59
|
-
# formatter: [Object|Proc]
|
60
|
-
# An instance of a class that implements #call, or a Proc to be used to format
|
61
|
-
# the output from this appender
|
62
|
-
# Default: Use the built-in formatter (See: #call)
|
63
|
-
#
|
64
|
-
# filter: [Regexp|Proc]
|
65
|
-
# RegExp: Only include log messages where the class name matches the supplied.
|
66
|
-
# regular expression. All other messages will be ignored.
|
67
|
-
# Proc: Only include log messages where the supplied Proc returns true
|
68
|
-
# The Proc must return true or false.
|
69
|
-
def initialize(options={}, &block)
|
70
|
-
# Backward compatibility
|
71
|
-
options = {level: options} unless options.is_a?(Hash)
|
72
|
-
options = options.dup
|
73
|
-
level = options.delete(:level)
|
74
|
-
filter = options.delete(:filter)
|
75
|
-
@formatter = options.delete(:formatter)
|
76
|
-
@formatter = self.class.extract_formatter(@formatter) if @formatter.is_a?(Symbol)
|
77
|
-
@formatter ||= block
|
78
|
-
# Default to #call method for formatting if defined for an appender
|
79
|
-
@formatter ||= (respond_to?(:call) ? self : SemanticLogger::Formatters::Default.new)
|
80
|
-
raise(ArgumentError, "Unknown options: #{options.inspect}") if options.size > 0
|
81
|
-
|
82
|
-
# Appenders don't take a class name, so use this class name if an appender
|
83
|
-
# is logged to directly
|
84
|
-
super(self.class, level, filter)
|
85
|
-
end
|
86
|
-
|
87
|
-
# Return the level index for fast comparisons
|
88
|
-
# Returns the lowest level index if the level has not been explicitly
|
89
|
-
# set for this instance
|
90
|
-
def level_index
|
91
|
-
@level_index || 0
|
92
|
-
end
|
93
|
-
|
94
|
-
# Return formatter for supplied Symbol
|
95
|
-
def self.extract_formatter(formatter)
|
96
|
-
SemanticLogger.send(:named_formatter, formatter).new
|
97
|
-
end
|
98
|
-
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|