ougai 2.0.0 → 2.1.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.
data/spec/logger_spec.rb DELETED
@@ -1,765 +0,0 @@
1
- require 'spec_helper'
2
- require 'stringio'
3
- require 'json'
4
-
5
- describe Ougai::Logger do
6
- let(:pid) { Process.pid }
7
-
8
- matcher :be_log_message do |message, level|
9
- match do |actual|
10
- actual[:name] == 'rspec' \
11
- && actual[:msg] == message \
12
- && actual[:level] == level \
13
- && actual[:pid] == pid \
14
- && actual[:v] == 0
15
- end
16
- end
17
-
18
- matcher :include_data do |data|
19
- match do |actual|
20
- data.each do |key, expected|
21
- return false unless actual[key] == expected
22
- end
23
- true
24
- end
25
- end
26
-
27
- matcher :include_error do |expected|
28
- match do |actual|
29
- err = actual[:err]
30
- err[:message] == expected \
31
- && err[:name] = 'StandardError' \
32
- && err[:stack].include?('<main>')
33
- end
34
- end
35
-
36
- let(:io) { StringIO.new }
37
- let(:logger) { described_class.new(io) }
38
-
39
- let(:item) do
40
- log_str = io.string
41
- begin
42
- JSON.parse(log_str, symbolize_names: true)
43
- rescue Exception
44
- nil
45
- end
46
- end
47
-
48
- class Dummy
49
- def to_hash
50
- { foo: 1 }
51
- end
52
- end
53
-
54
- describe '.new' do
55
- context 'if formatter argument is not specified' do
56
- it 'sets Bunyan to formatter attribute' do
57
- expect(logger.formatter).to be_an(Ougai::Formatters::Bunyan)
58
- end
59
- end
60
-
61
- if RUBY_VERSION > '2.4'
62
- context 'if formatter argument is specified' do
63
- it 'sets it to formatter attribute' do
64
- a_formatter = Ougai::Formatters::Readable.new
65
- a_logger = described_class.new(io, formatter: a_formatter)
66
- expect(a_logger.formatter).to eq a_formatter
67
- end
68
- end
69
- end
70
- end
71
-
72
- shared_examples 'log' do
73
- context 'with message' do
74
- it 'outputs valid' do
75
- logger.send(method, log_msg)
76
- expect(item).to be_log_message(log_msg, log_level)
77
- end
78
-
79
- it 'outputs valid by block' do
80
- logger.send(method) { log_msg }
81
- expect(item).to be_log_message(log_msg, log_level)
82
- end
83
- end
84
-
85
- context 'with exception' do
86
- it 'outputs valid' do
87
- begin
88
- raise StandardError, 'errmsg'
89
- rescue => ex
90
- logger.send(method, ex)
91
- end
92
-
93
- expect(item).to be_log_message('errmsg', log_level)
94
- expect(item).to include_error('errmsg')
95
- end
96
-
97
- it 'outputs valid by block' do
98
- begin
99
- raise StandardError, 'errmsg'
100
- rescue => ex
101
- logger.send(method) { ex }
102
- end
103
-
104
- expect(item).to be_log_message('errmsg', log_level)
105
- expect(item).to include_error('errmsg')
106
- end
107
- end
108
-
109
- context 'with data that contains msg' do
110
- it 'outputs valid' do
111
- logger.send(method, { msg: log_msg, data_id: 108, action: 'dump' })
112
- expect(item).to be_log_message(log_msg, log_level)
113
- expect(item).to include_data(data_id: 108, action: 'dump')
114
- end
115
-
116
- it 'outputs valid by block' do
117
- logger.send(method) do
118
- { msg: log_msg, data_id: 108, action: 'dump' }
119
- end
120
- expect(item).to be_log_message(log_msg, log_level)
121
- expect(item).to include_data(data_id: 108, action: 'dump')
122
- end
123
-
124
- it 'outputs valid with fields' do
125
- logger.with_fields = { coreField1: 123, core_field2: 'core', 'core_field3' => 456 }
126
- logger.send(method, { msg: log_msg, data_id: 109, action: 'do' })
127
- expect(item).to be_log_message(log_msg, log_level)
128
- expect(item).to include_data(data_id: 109, action: 'do', coreField1: 123, core_field2: 'core', core_field3: 456)
129
- end
130
-
131
- it 'outputs valid with fields overridden' do
132
- logger.with_fields = { core_field1: 'original', core_field2: 'original', err: 'original' }
133
- logger.send(method, { msg: log_msg, data_id: 110, action: 'do', core_field1: 'override' })
134
- expect(item).to be_log_message(log_msg, log_level)
135
- expect(item).to include_data(data_id: 110, action: 'do', core_field1: 'override', core_field2: 'original', err: 'original')
136
- end
137
- end
138
-
139
- context 'with data that does not contain msg' do
140
- it 'outputs valid' do
141
- logger.send(method, { data_id: 109, action: 'dump' })
142
- expect(item).to be_log_message('No message', log_level)
143
- expect(item).to include_data(data_id: 109, action: 'dump')
144
- end
145
-
146
- it 'outputs valid by block' do
147
- logger.send(method) do
148
- { data_id: 109, action: 'dump' }
149
- end
150
- expect(item).to be_log_message('No message', log_level)
151
- expect(item).to include_data(data_id: 109, action: 'dump')
152
- end
153
- end
154
-
155
- context 'with data that can respond to_hash' do
156
- it 'outputs valid' do
157
- logger.send(method, Dummy.new)
158
- expect(item).to be_log_message('No message', log_level)
159
- expect(item).to include_data(foo: 1)
160
- end
161
- end
162
-
163
- context 'with data that cannot respond to_hash' do
164
- it '(array) outputs valid' do
165
- logger.send(method, ['bar', 2])
166
- expect(item).to be_log_message('No message', log_level)
167
- expect(item).to include_data(data: ['bar', 2])
168
- end
169
-
170
- it '(number) outputs valid' do
171
- logger.send(method, 999)
172
- expect(item).to be_log_message('No message', log_level)
173
- expect(item).to include_data(data: 999)
174
- end
175
- end
176
-
177
- context 'with message and data' do
178
- it 'outputs valid' do
179
- logger.send(method, log_msg, data_id: 99, action: 'insert')
180
- expect(item).to be_log_message(log_msg, log_level)
181
- expect(item).to include_data(data_id: 99, action: 'insert')
182
- end
183
-
184
- it 'outputs valid by block' do
185
- logger.send(method) { [log_msg, data_id: 99, action: 'insert'] }
186
- expect(item).to be_log_message(log_msg, log_level)
187
- expect(item).to include_data(data_id: 99, action: 'insert')
188
- end
189
- end
190
-
191
- context 'with message and exception' do
192
- it 'outputs valid' do
193
- begin
194
- raise StandardError, 'errmsg'
195
- rescue => ex
196
- logger.send(method, log_msg, ex)
197
- end
198
-
199
- expect(item).to be_log_message(log_msg, log_level)
200
- expect(item).to include_error('errmsg')
201
- end
202
-
203
- it 'outputs valid by block' do
204
- begin
205
- raise StandardError, 'errmsg'
206
- rescue => ex
207
- logger.send(method) { [log_msg, ex] }
208
- end
209
-
210
- expect(item).to be_log_message(log_msg, log_level)
211
- expect(item).to include_error('errmsg')
212
- end
213
-
214
- it 'outputs valid overridden err field' do
215
- logger.with_fields = { err: 'original' }
216
- begin
217
- raise StandardError, 'errmsg2'
218
- rescue => ex
219
- logger.send(method, log_msg, ex)
220
- end
221
-
222
- expect(item).to include_error('errmsg2')
223
- end
224
- end
225
-
226
- context 'with exception and data' do
227
- it 'outputs valid' do
228
- begin
229
- raise StandardError, 'errmsg'
230
- rescue => ex
231
- logger.send(method, ex, something: { name: 'bar' })
232
- end
233
-
234
- expect(item).to include_error('errmsg')
235
- expect(item).to include_data(something: { name: 'bar' })
236
- end
237
-
238
- it 'outputs valid by block' do
239
- begin
240
- raise StandardError, 'errmsg'
241
- rescue => ex
242
- logger.send(method) do
243
- [ex, something: { name: 'bar' }]
244
- end
245
- end
246
-
247
- expect(item).to include_error('errmsg')
248
- expect(item).to include_data(something: { name: 'bar' })
249
- end
250
- end
251
-
252
- context 'with message, exception and data' do
253
- it 'outputs valid' do
254
- begin
255
- raise StandardError, 'errmsg'
256
- rescue => ex
257
- logger.send(method, log_msg, ex, something: { name: 'foo' })
258
- end
259
-
260
- expect(item).to be_log_message(log_msg, log_level)
261
- expect(item).to include_error('errmsg')
262
- expect(item).to include_data(something: { name: 'foo' })
263
- end
264
-
265
- it 'outputs valid by block' do
266
- begin
267
- raise StandardError, 'errmsg'
268
- rescue => ex
269
- logger.send(method) do
270
- [log_msg, ex, something: { name: 'foo' }]
271
- end
272
- end
273
-
274
- expect(item).to be_log_message(log_msg, log_level)
275
- expect(item).to include_error('errmsg')
276
- expect(item).to include_data(something: { name: 'foo' })
277
- end
278
- end
279
-
280
- context 'without arguments' do
281
- it 'outputs only default message' do
282
- logger.send(method)
283
- expect(item).to be_log_message('No message', log_level)
284
- end
285
- end
286
- end
287
-
288
- describe '#trace' do
289
- let(:log_level) { 10 }
290
- let(:log_msg) { 'trace message' }
291
- let(:method) { 'trace' }
292
-
293
- before { logger.level = :trace }
294
-
295
- it_behaves_like 'log'
296
-
297
- it 'is consistent with the methods severity allows' do
298
- expect(logger.trace?).to be_truthy
299
- expect(logger.debug?).to be_truthy
300
- expect(logger.info?).to be_truthy
301
- expect(logger.warn?).to be_truthy
302
- expect(logger.error?).to be_truthy
303
- expect(logger.fatal?).to be_truthy
304
- end
305
- end
306
-
307
- describe '#debug' do
308
- let(:log_level) { 20 }
309
- let(:log_msg) { 'debug message' }
310
- let(:method) { 'debug' }
311
-
312
- it_behaves_like 'log'
313
-
314
- it 'is consistent with the methods severity allows' do
315
- expect(logger.trace?).to be_falsey
316
- expect(logger.debug?).to be_truthy
317
- end
318
- end
319
-
320
- describe '#info' do
321
- let(:log_level) { 30 }
322
- let(:log_msg) { 'info message' }
323
- let(:method) { 'info' }
324
-
325
- it_behaves_like 'log'
326
- end
327
-
328
- describe '#warn' do
329
- let(:log_level) { 40 }
330
- let(:log_msg) { 'info message' }
331
- let(:method) { 'warn' }
332
-
333
- it_behaves_like 'log'
334
- end
335
-
336
- describe '#error' do
337
- let(:log_level) { 50 }
338
- let(:log_msg) { 'error message' }
339
- let(:method) { 'error' }
340
-
341
- it_behaves_like 'log'
342
- end
343
-
344
- describe '#fatal' do
345
- let(:log_level) { 60 }
346
- let(:log_msg) { 'fatal message' }
347
- let(:method) { 'fatal' }
348
-
349
- it_behaves_like 'log'
350
- end
351
-
352
- describe '#unknown' do
353
- let(:log_level) { 70 }
354
- let(:log_msg) { 'unknown message' }
355
- let(:method) { 'unknown' }
356
-
357
- it_behaves_like 'log'
358
- end
359
-
360
- describe '#level' do
361
- context 'DEBUG' do
362
- let(:log_msg) { 'log message' }
363
- before { logger.level = Logger::DEBUG }
364
-
365
- it 'outputs debug message' do
366
- logger.debug(log_msg)
367
- expect(item).to be_log_message(log_msg, 20)
368
- end
369
-
370
- it 'outputs info message' do
371
- logger.info(log_msg)
372
- expect(item).to be_log_message(log_msg, 30)
373
- end
374
-
375
- it 'outputs warning message' do
376
- logger.warn(log_msg)
377
- expect(item).to be_log_message(log_msg, 40)
378
- end
379
-
380
- it 'outputs error message' do
381
- logger.error(log_msg)
382
- expect(item).to be_log_message(log_msg, 50)
383
- end
384
-
385
- it 'outputs fatal message' do
386
- logger.fatal(log_msg)
387
- expect(item).to be_log_message(log_msg, 60)
388
- end
389
-
390
- it 'outputs unknown message' do
391
- logger.unknown(log_msg)
392
- expect(item).to be_log_message(log_msg, 70)
393
- end
394
- end
395
-
396
- context 'INFO' do
397
- let(:log_msg) { 'log message' }
398
- before { logger.level = Logger::INFO }
399
-
400
- it 'does not output debug message' do
401
- logger.debug(log_msg)
402
- expect(item).to be_nil
403
- end
404
-
405
- it 'outputs info message' do
406
- logger.info(log_msg)
407
- expect(item).to be_log_message(log_msg, 30)
408
- end
409
-
410
- it 'outputs warning message' do
411
- logger.warn(log_msg)
412
- expect(item).to be_log_message(log_msg, 40)
413
- end
414
-
415
- it 'outputs error message' do
416
- logger.error(log_msg)
417
- expect(item).to be_log_message(log_msg, 50)
418
- end
419
-
420
- it 'outputs fatal message' do
421
- logger.fatal(log_msg)
422
- expect(item).to be_log_message(log_msg, 60)
423
- end
424
-
425
- it 'outputs unknown message' do
426
- logger.unknown(log_msg)
427
- expect(item).to be_log_message(log_msg, 70)
428
- end
429
- end
430
-
431
- context 'WARN' do
432
- let(:log_msg) { 'log message' }
433
- before { logger.level = Logger::WARN }
434
-
435
- it 'does not output debug message' do
436
- logger.debug(log_msg)
437
- expect(item).to be_nil
438
- end
439
-
440
- it 'does not output info message' do
441
- logger.info(log_msg)
442
- expect(item).to be_nil
443
- end
444
-
445
- it 'outputs warning message' do
446
- logger.warn(log_msg)
447
- expect(item).to be_log_message(log_msg, 40)
448
- end
449
-
450
- it 'outputs error message' do
451
- logger.error(log_msg)
452
- expect(item).to be_log_message(log_msg, 50)
453
- end
454
-
455
- it 'outputs fatal message' do
456
- logger.fatal(log_msg)
457
- expect(item).to be_log_message(log_msg, 60)
458
- end
459
-
460
- it 'outputs unknown message' do
461
- logger.unknown(log_msg)
462
- expect(item).to be_log_message(log_msg, 70)
463
- end
464
- end
465
-
466
- context 'ERROR' do
467
- let(:log_msg) { 'log message' }
468
- before { logger.level = Logger::ERROR }
469
-
470
- it 'does not output debug message' do
471
- logger.debug(log_msg)
472
- expect(item).to be_nil
473
- end
474
-
475
- it 'does not output info message' do
476
- logger.info(log_msg)
477
- expect(item).to be_nil
478
- end
479
-
480
- it 'does not output warning message' do
481
- logger.warn(log_msg)
482
- expect(item).to be_nil
483
- end
484
-
485
- it 'outputs error message' do
486
- logger.error(log_msg)
487
- expect(item).to be_log_message(log_msg, 50)
488
- end
489
-
490
- it 'outputs fatal message' do
491
- logger.fatal(log_msg)
492
- expect(item).to be_log_message(log_msg, 60)
493
- end
494
-
495
- it 'outputs unknown message' do
496
- logger.unknown(log_msg)
497
- expect(item).to be_log_message(log_msg, 70)
498
- end
499
- end
500
-
501
- context 'FATAL' do
502
- let(:log_msg) { 'log message' }
503
- before { logger.level = Logger::FATAL }
504
-
505
- it 'does not output debug message' do
506
- logger.debug(log_msg)
507
- expect(item).to be_nil
508
- end
509
-
510
- it 'does not output info message' do
511
- logger.info(log_msg)
512
- expect(item).to be_nil
513
- end
514
-
515
- it 'does not output warning message' do
516
- logger.warn(log_msg)
517
- expect(item).to be_nil
518
- end
519
-
520
- it 'does not output error message' do
521
- logger.error(log_msg)
522
- expect(item).to be_nil
523
- end
524
-
525
- it 'outputs fatal message' do
526
- logger.fatal(log_msg)
527
- expect(item).to be_log_message(log_msg, 60)
528
- end
529
-
530
- it 'outputs unknown message' do
531
- logger.unknown(log_msg)
532
- expect(item).to be_log_message(log_msg, 70)
533
- end
534
- end
535
-
536
- context 'UNKNOWN' do
537
- let(:log_msg) { 'log message' }
538
- before { logger.level = Logger::UNKNOWN }
539
-
540
- it 'does not output debug message' do
541
- logger.debug(log_msg)
542
- expect(item).to be_nil
543
- end
544
-
545
- it 'does not output info message' do
546
- logger.info(log_msg)
547
- expect(item).to be_nil
548
- end
549
-
550
- it 'does not output warning message' do
551
- logger.warn(log_msg)
552
- expect(item).to be_nil
553
- end
554
-
555
- it 'does not output error message' do
556
- logger.error(log_msg)
557
- expect(item).to be_nil
558
- end
559
-
560
- it 'does not output fatal message' do
561
- logger.fatal(log_msg)
562
- expect(item).to be_nil
563
- end
564
-
565
- it 'outputs unknown message' do
566
- logger.unknown(log_msg)
567
- expect(item).to be_log_message(log_msg, 70)
568
- end
569
- end
570
- end
571
-
572
- describe '#before_log' do
573
- let(:log_msg) { 'before_log test' }
574
-
575
- context 'set context data' do
576
- before do
577
- logger.level = Logger::INFO
578
- logger.before_log = lambda do |data|
579
- data[:context_id] = 123
580
- end
581
- end
582
-
583
- it 'outputs with context data' do
584
- logger.info(log_msg)
585
- expect(item).to be_log_message(log_msg, 30)
586
- expect(item).to include(context_id: 123)
587
- end
588
- end
589
-
590
- context 'cancelling log' do
591
- before do
592
- logger.level = Logger::INFO
593
- logger.before_log = lambda do |data|
594
- false
595
- end
596
- end
597
-
598
- it 'outputs none' do
599
- logger.info(log_msg)
600
- expect(item).to be_nil
601
- end
602
- end
603
- end
604
-
605
- describe '#broadcast' do
606
- let(:log_msg) { 'broadcast test message' }
607
-
608
- let(:another_io) { StringIO.new }
609
- let(:another_logger) { described_class.new(another_io) }
610
-
611
- let(:another_item) do
612
- log_str = another_io.string
613
- begin
614
- JSON.parse(log_str, symbolize_names: true)
615
- rescue Exception
616
- nil
617
- end
618
- end
619
-
620
- before do
621
- logger.extend Ougai::Logger.broadcast(another_logger)
622
- end
623
-
624
- context 'another logger level is the same as original one' do
625
- before do
626
- logger.level = Logger::INFO # propagate severity to another one
627
- end
628
-
629
- it 'does not output trace log on both loggers' do
630
- logger.trace(log_msg, foo: 0)
631
- expect(item).to be_nil
632
- expect(another_item).to be_nil
633
- end
634
-
635
- it 'does not output debug log on both loggers' do
636
- logger.debug(log_msg, foo: 1)
637
- expect(item).to be_nil
638
- expect(another_item).to be_nil
639
- end
640
-
641
- it 'does not output debug log with block on both loggers' do
642
- logger.debug { [log_msg, foo: 1] }
643
- expect(item).to be_nil
644
- expect(another_item).to be_nil
645
- end
646
-
647
- it 'outputs info log on both loggers' do
648
- logger.info(log_msg, foo: 2)
649
- expect(item).to be_log_message(log_msg, 30)
650
- expect(item).to include_data(foo: 2)
651
- expect(another_item).to be_log_message(log_msg, 30)
652
- expect(another_item).to include_data(foo: 2)
653
- end
654
-
655
- it 'outputs info log with block on both loggers' do
656
- logger.info { [log_msg, { foo: 2 }] }
657
- expect(item).to be_log_message(log_msg, 30)
658
- expect(item).to include_data(foo: 2)
659
- expect(another_item).to be_log_message(log_msg, 30)
660
- expect(another_item).to include_data(foo: 2)
661
- end
662
-
663
- it 'outputs warning log on both loggers' do
664
- logger.warn(log_msg)
665
- expect(item).to be_log_message(log_msg, 40)
666
- expect(another_item).to be_log_message(log_msg, 40)
667
- end
668
- end
669
-
670
- context 'another logger level is lower than original one' do
671
- before do
672
- logger.level = Logger::DEBUG
673
- another_logger.level = :trace
674
- end
675
-
676
- it 'does not output trace log on both loggers' do
677
- logger.trace(log_msg)
678
- expect(item).to be_nil
679
- expect(another_item).to be_log_message(log_msg, 10)
680
- end
681
-
682
- it 'outputs debug log on both loggers' do
683
- logger.debug(log_msg)
684
- expect(item).to be_log_message(log_msg, 20)
685
- expect(another_item).to be_log_message(log_msg, 20)
686
- end
687
- end
688
-
689
- context 'another logger level is greater than original one' do
690
- before do
691
- logger.level = Logger::INFO
692
- another_logger.level = Logger::WARN
693
- end
694
-
695
- it 'outputs info log on only original logger' do
696
- logger.info(log_msg)
697
- expect(item).to be_log_message(log_msg, 30)
698
- expect(another_item).to be_nil
699
- end
700
-
701
- it 'outputs warning log on both loggers' do
702
- logger.warn(log_msg)
703
- expect(item).to be_log_message(log_msg, 40)
704
- expect(another_item).to be_log_message(log_msg, 40)
705
- end
706
- end
707
-
708
- it 'close both loogers' do
709
- logger.close
710
- expect(io.closed?).to be_truthy
711
- expect(another_io.closed?).to be_truthy
712
- end
713
- end
714
-
715
- describe '.child_class' do
716
- let!(:org_logger_cls) { described_class }
717
- let!(:sc_logger_cls) { Class.new(described_class) }
718
-
719
- context 'when Logger class is original' do
720
- subject { described_class.child_class }
721
-
722
- it { is_expected.to eq(Ougai::ChildLogger) }
723
- end
724
-
725
- context 'when Logger class is sub-class' do
726
- subject { Class.new(described_class).child_class }
727
-
728
- it 'returns sub-class of Ougai::ChildLogger' do
729
- expect(subject).not_to eq(Ougai::ChildLogger)
730
- expect(subject.superclass).to eq(Ougai::ChildLogger)
731
- end
732
- end
733
- end
734
-
735
- describe '#child' do
736
- context 'when Logger class is original' do
737
- subject!(:org_instance) { described_class.new(STDOUT) }
738
-
739
- it 'returns ChildLogger instance' do
740
- expect(org_instance.child).to be_an_instance_of(Ougai::ChildLogger)
741
- end
742
- end
743
-
744
- context 'when Logger class is sub-class' do
745
- subject!(:sc_instance) { Class.new(described_class).new(STDOUT) }
746
-
747
- it 'returns an instance of the child_class' do
748
- expect(sc_instance.child).to be_an_instance_of(sc_instance.class.child_class)
749
- end
750
- end
751
-
752
- context 'block is given' do
753
- let!(:fields) { double('fields') }
754
-
755
- subject { described_class.new(STDOUT) }
756
-
757
- it 'yields child logger' do
758
- subject.child(fields) do |cl|
759
- expect(cl.instance_variable_get(:@parent)).to eq(subject)
760
- expect(cl.instance_variable_get(:@with_fields)).to eq(fields)
761
- end
762
- end
763
- end
764
- end
765
- end