multiple_devices_logger 1.1.0 → 2.0.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.mdown +6 -15
- data/VERSION +1 -1
- data/lib/multiple_devices_logger.rb +15 -27
- data/spec/multiple_devices_logger_spec.rb +21 -120
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ae86567df1e4256c8ed249fb12684753e072f26
|
4
|
+
data.tar.gz: cf237ccec6259568639c300bcd70ecb883fca1f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ee12be1c9b809603600ef58a6615ee5973a64a1f43ec6b5e9c5092a000cfdd7fd112e2f9e57a1b0ea3e1545884fc29fce0f4c42d5e9ed6c5ffaeec112a77002
|
7
|
+
data.tar.gz: a2e849b612fe6430eb6826e6d106bc196810f3a7be700622a743a288970ec50fe7f32c79a7c7d5a0b721e350326d489507013036d3e2f24827d0b6bcf385fca5
|
data/README.mdown
CHANGED
@@ -68,26 +68,17 @@ Just use `#clear_devices` to clear all registered devices:
|
|
68
68
|
logger.clear_devices
|
69
69
|
```
|
70
70
|
|
71
|
-
### Custom formatter for each
|
71
|
+
### Custom formatter for each device
|
72
72
|
|
73
|
-
|
74
|
-
|
73
|
+
You can configure a formatter for each device via `:formatter` option, here
|
74
|
+
is an example:
|
75
75
|
|
76
76
|
```ruby
|
77
|
-
|
78
|
-
logger.set_formatter(:debug) { |severity, time, progname, message| "[#{severity}] #{message}" }
|
79
|
-
|
80
|
-
# Formatter can also be specified as first argument
|
81
|
-
my_formatter = -> { |severity, time, progname, message| "#{progname} -> #{message} @ #{time}" }
|
82
|
-
logger.set_formatter(my_formatter, Logger::ERROR)
|
83
|
-
|
84
|
-
# Operators can also be used
|
85
|
-
logger.set_formatter('>= warn') { |severity, time, progname, message| "[#{severity}] #{message}" }
|
86
|
-
|
87
|
-
# Like #add_device, many severities can be specified
|
88
|
-
logger.set_formatter(:debug, :info) { |severity, time, progname, message| "[#{severity}] #{message}" }
|
77
|
+
logger.add_device(STDERR, :debug, formatter: -> (severity, time, progname, message) { "[#{severity}] #{message}\n" })
|
89
78
|
```
|
90
79
|
|
80
|
+
Otherwise default formatter is used.
|
81
|
+
|
91
82
|
## Executing test suite
|
92
83
|
|
93
84
|
This project is fully tested with [Rspec 3](http://github.com/rspec/rspec).
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.0.0
|
@@ -18,7 +18,6 @@ class MultipleDevicesLogger < Logger
|
|
18
18
|
def initialize
|
19
19
|
super(nil)
|
20
20
|
clear_devices
|
21
|
-
clear_formatters
|
22
21
|
end
|
23
22
|
|
24
23
|
def add(severity, message = nil, progname = nil)
|
@@ -33,9 +32,9 @@ class MultipleDevicesLogger < Logger
|
|
33
32
|
progname = self.progname
|
34
33
|
end
|
35
34
|
end
|
36
|
-
text = formatter_for(severity).call(format_severity(severity), Time.now, progname, message)
|
37
35
|
devices_for(severity).each do |device|
|
38
|
-
device.
|
36
|
+
formatter = device.formatter || self.formatter || @default_formatter
|
37
|
+
device.write(formatter.call(format_severity(severity), Time.now, progname, message))
|
39
38
|
end
|
40
39
|
true
|
41
40
|
end
|
@@ -44,7 +43,13 @@ class MultipleDevicesLogger < Logger
|
|
44
43
|
def add_device(device, *severities)
|
45
44
|
severities = [severities].flatten
|
46
45
|
options = severities.extract_options!
|
47
|
-
|
46
|
+
formatter = nil
|
47
|
+
if options.key?(:formatter)
|
48
|
+
formatter = options.delete(:formatter)
|
49
|
+
raise ArgumentError.new("Formatter must respond to #call, #{formatter.inspect} given") unless formatter.respond_to?(:call)
|
50
|
+
end
|
51
|
+
device = LogDevice.new(device, options) unless device.is_a?(Logger::LogDevice)
|
52
|
+
device.formatter = formatter
|
48
53
|
if severities.empty?
|
49
54
|
keys = SEVERITIES.values
|
50
55
|
else
|
@@ -61,10 +66,6 @@ class MultipleDevicesLogger < Logger
|
|
61
66
|
@devices = {}
|
62
67
|
end
|
63
68
|
|
64
|
-
def clear_formatters
|
65
|
-
@formatters = {}
|
66
|
-
end
|
67
|
-
|
68
69
|
def default_device=(value)
|
69
70
|
@default_device = value.is_a?(LogDevice) ? value : LogDevice.new(value)
|
70
71
|
end
|
@@ -73,29 +74,10 @@ class MultipleDevicesLogger < Logger
|
|
73
74
|
@devices[parse_severity(severity)] || [default_device].compact || []
|
74
75
|
end
|
75
76
|
|
76
|
-
def formatter_for(severity)
|
77
|
-
@formatters[parse_severity(severity)] || formatter || @default_formatter
|
78
|
-
end
|
79
|
-
|
80
77
|
def reopen(log = nil)
|
81
78
|
raise NotImplementedError.new("#{self.class}#reopen")
|
82
79
|
end
|
83
80
|
|
84
|
-
def set_formatter(*severities)
|
85
|
-
formatter = block_given? ? Proc.new { |*args| yield(*args) } : severities.shift
|
86
|
-
raise ArgumentError.new("Formatter must be specified via first parameter or a block, #{formatter.inspect} given") unless formatter.respond_to?(:call)
|
87
|
-
severities = [severities].flatten
|
88
|
-
if severities.empty?
|
89
|
-
keys = SEVERITIES.values
|
90
|
-
else
|
91
|
-
keys = severities.map { |severity| parse_severities_with_operator(severity) }.flatten.uniq
|
92
|
-
end
|
93
|
-
keys.each do |key|
|
94
|
-
@formatters[key] = formatter
|
95
|
-
end
|
96
|
-
self
|
97
|
-
end
|
98
|
-
|
99
81
|
private
|
100
82
|
|
101
83
|
def format_message(severity, datetime, progname, msg)
|
@@ -119,3 +101,9 @@ class MultipleDevicesLogger < Logger
|
|
119
101
|
end
|
120
102
|
|
121
103
|
end
|
104
|
+
|
105
|
+
class Logger::LogDevice
|
106
|
+
|
107
|
+
attr_accessor :formatter
|
108
|
+
|
109
|
+
end
|
@@ -73,10 +73,10 @@ describe MultipleDevicesLogger do
|
|
73
73
|
logger.add(Logger::WARN, nil, 'BAM!')
|
74
74
|
end
|
75
75
|
|
76
|
-
it 'use formatter set
|
77
|
-
logger.
|
76
|
+
it 'use formatter set' do
|
77
|
+
logger.add_device(STDERR, '> debug', formatter: -> (severity, time, progname, message) { "Hello #{message}" })
|
78
78
|
expect(STDERR).to receive(:write).with('Hello John')
|
79
|
-
logger.add(Logger::
|
79
|
+
logger.add(Logger::INFO, 'John')
|
80
80
|
end
|
81
81
|
|
82
82
|
it 'use default formatter if not set' do
|
@@ -86,14 +86,16 @@ describe MultipleDevicesLogger do
|
|
86
86
|
end
|
87
87
|
|
88
88
|
it 'use default formatter if formatter set via #set_formatter does not match severity' do
|
89
|
-
logger.add_device(STDERR, '
|
90
|
-
logger.set_formatter(:debug) { |severity, time, progname, message| "Hello #{message}" }
|
89
|
+
logger.add_device(STDERR, '<= info', formatter: -> (severity, time, progname, message) { "Hello #{message}" })
|
91
90
|
|
92
91
|
expect(STDERR).to receive(:write).with(/WARN -- : John/)
|
93
92
|
logger.add(Logger::WARN, 'John')
|
94
93
|
|
95
94
|
expect(STDERR).to receive(:write).with('Hello John')
|
96
95
|
logger.add(Logger::DEBUG, 'John')
|
96
|
+
|
97
|
+
expect(STDERR).to receive(:write).with('Hello John')
|
98
|
+
logger.add(Logger::INFO, 'John')
|
97
99
|
end
|
98
100
|
|
99
101
|
end
|
@@ -304,16 +306,29 @@ describe MultipleDevicesLogger do
|
|
304
306
|
end
|
305
307
|
|
306
308
|
it 'given options are forwared to LogDevice constructor' do
|
307
|
-
|
309
|
+
device = Logger::LogDevice.new(STDOUT)
|
310
|
+
expect(Logger::LogDevice).to receive(:new).with(STDOUT, foo: 'bar').and_return(device)
|
308
311
|
logger.add_device(STDOUT, Logger::INFO, foo: 'bar')
|
309
312
|
end
|
310
313
|
|
314
|
+
it 'does not forward :formatter option to log device constructor' do
|
315
|
+
device = Logger::LogDevice.new(STDOUT)
|
316
|
+
expect(Logger::LogDevice).to receive(:new).with(STDOUT, foo: 'bar').and_return(device)
|
317
|
+
logger.add_device(STDOUT, Logger::INFO, foo: 'bar', formatter: -> {})
|
318
|
+
end
|
319
|
+
|
311
320
|
it 'raise an error for default severity' do
|
312
321
|
expect {
|
313
322
|
logger.add_device(STDERR, 'default')
|
314
323
|
}.to raise_error(ArgumentError, 'Invalid log severity: "default"')
|
315
324
|
end
|
316
325
|
|
326
|
+
it 'raise an error if formatter is not a proc' do
|
327
|
+
expect {
|
328
|
+
logger.add_device(STDOUT, formatter: :foo)
|
329
|
+
}.to raise_error(ArgumentError, 'Formatter must respond to #call, :foo given')
|
330
|
+
end
|
331
|
+
|
317
332
|
end
|
318
333
|
|
319
334
|
describe '#clear_devices' do
|
@@ -327,19 +342,6 @@ describe MultipleDevicesLogger do
|
|
327
342
|
|
328
343
|
end
|
329
344
|
|
330
|
-
describe '#clear_formatters' do
|
331
|
-
|
332
|
-
it 'removes registerd formatters' do
|
333
|
-
default_formatter = logger.formatter_for(:info)
|
334
|
-
formatter = -> { 'hello' }
|
335
|
-
logger.set_formatter(formatter, :info)
|
336
|
-
expect {
|
337
|
-
logger.clear_formatters
|
338
|
-
}.to change { logger.formatter_for(:info) }.from(formatter).to(default_formatter)
|
339
|
-
end
|
340
|
-
|
341
|
-
end
|
342
|
-
|
343
345
|
describe '#default_device' do
|
344
346
|
|
345
347
|
it 'is nil by default' do
|
@@ -401,40 +403,6 @@ describe MultipleDevicesLogger do
|
|
401
403
|
|
402
404
|
end
|
403
405
|
|
404
|
-
describe '#formatter_for' do
|
405
|
-
|
406
|
-
it 'returns a default formatter by default' do
|
407
|
-
expect(logger.formatter_for(:debug)).to be_a(Logger::Formatter)
|
408
|
-
end
|
409
|
-
|
410
|
-
it 'returns formatter set via #formatter= instead' do
|
411
|
-
formatter = -> {}
|
412
|
-
logger.formatter = formatter
|
413
|
-
expect(logger.formatter_for(:info)).to be(formatter)
|
414
|
-
end
|
415
|
-
|
416
|
-
it 'returns formatter set via #set_formatter method' do
|
417
|
-
formatter = -> {}
|
418
|
-
logger.set_formatter(formatter, :debug)
|
419
|
-
expect(logger.formatter_for(:debug)).to be(formatter)
|
420
|
-
end
|
421
|
-
|
422
|
-
it 'priority is #set_formatter -> #formatter' do
|
423
|
-
logger.formatter = -> { 'default' }
|
424
|
-
logger.set_formatter(:info) { 'info formatter' }
|
425
|
-
expect(logger.formatter_for(:debug).call).to eq('default')
|
426
|
-
expect(logger.formatter_for(:info).call).to eq('info formatter')
|
427
|
-
expect(logger.formatter_for(:warn).call).to eq('default')
|
428
|
-
end
|
429
|
-
|
430
|
-
it 'raise an error if severity is invalid' do
|
431
|
-
expect {
|
432
|
-
logger.formatter_for(:bim)
|
433
|
-
}.to raise_error(ArgumentError, "Invalid log severity: :bim")
|
434
|
-
end
|
435
|
-
|
436
|
-
end
|
437
|
-
|
438
406
|
describe '#initialize' do
|
439
407
|
|
440
408
|
it 'accepts no argument' do
|
@@ -483,73 +451,6 @@ describe MultipleDevicesLogger do
|
|
483
451
|
|
484
452
|
end
|
485
453
|
|
486
|
-
describe '#set_formatter' do
|
487
|
-
|
488
|
-
it 'sets formatter for devices of given levels' do
|
489
|
-
logger.add_device(STDERR, '> warn')
|
490
|
-
logger.add_device(STDOUT, 'debug')
|
491
|
-
default_formatter = -> { 'world' }
|
492
|
-
formatter = -> { 'hello' }
|
493
|
-
logger.formatter = default_formatter
|
494
|
-
|
495
|
-
expect {
|
496
|
-
logger.set_formatter(formatter, '> info')
|
497
|
-
}.to change { logger.formatter_for('error') }.from(default_formatter).to(formatter)
|
498
|
-
|
499
|
-
expect(logger.formatter_for('debug')).to be(default_formatter)
|
500
|
-
end
|
501
|
-
|
502
|
-
it 'use given block if formatter is not specified' do
|
503
|
-
expect {
|
504
|
-
logger.set_formatter('> debug') { |severity, time, progname, message| "Hello #{message}" }
|
505
|
-
}.to change { logger.formatter_for('info').call('WARN', Time.now, nil, 'John') }.to('Hello John')
|
506
|
-
end
|
507
|
-
|
508
|
-
it 'raise an error if no formatter or block is given' do
|
509
|
-
expect {
|
510
|
-
logger.set_formatter('> debug')
|
511
|
-
}.to raise_error(ArgumentError, 'Formatter must be specified via first parameter or a block, "> debug" given')
|
512
|
-
end
|
513
|
-
|
514
|
-
it 'can be set for all devices' do
|
515
|
-
formatter = -> { 'hello' }
|
516
|
-
logger.add_device(STDERR)
|
517
|
-
logger.set_formatter(formatter, '> debug')
|
518
|
-
expect(logger.formatter_for('info')).to be(formatter)
|
519
|
-
expect(logger.formatter_for('error')).to be(formatter)
|
520
|
-
end
|
521
|
-
|
522
|
-
it 'raise an error if not a proc' do
|
523
|
-
expect {
|
524
|
-
logger.set_formatter(:foo, '> debug')
|
525
|
-
}.to raise_error(ArgumentError, 'Formatter must be specified via first parameter or a block, :foo given')
|
526
|
-
end
|
527
|
-
|
528
|
-
it 'raise an error if no parameter is given' do
|
529
|
-
expect {
|
530
|
-
logger.set_formatter
|
531
|
-
}.to raise_error(ArgumentError, 'Formatter must be specified via first parameter or a block, nil given')
|
532
|
-
end
|
533
|
-
|
534
|
-
it 'severities can be specified as array' do
|
535
|
-
formatter = -> { 'hello' }
|
536
|
-
logger.add_device(STDERR)
|
537
|
-
logger.set_formatter(formatter, ['debug', 'info'])
|
538
|
-
expect(logger.formatter_for('info')).to be(formatter)
|
539
|
-
end
|
540
|
-
|
541
|
-
it 'raise an error if severity is invalid' do
|
542
|
-
expect {
|
543
|
-
logger.set_formatter(:foo) { 'hello' }
|
544
|
-
}.to raise_error(ArgumentError, 'Invalid log severity: :foo')
|
545
|
-
end
|
546
|
-
|
547
|
-
it 'returns self' do
|
548
|
-
expect(logger.set_formatter(-> {}, :debug)).to be(logger)
|
549
|
-
end
|
550
|
-
|
551
|
-
end
|
552
|
-
|
553
454
|
describe '#warn' do
|
554
455
|
|
555
456
|
it 'does not output anything if there is no device' do
|