loggability 0.7.0 → 0.8.0.pre.65
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/Manifest.txt +5 -1
- data/README.rdoc +30 -0
- data/Rakefile +5 -3
- data/lib/loggability/logclient.rb +48 -0
- data/lib/loggability/logger.rb +26 -4
- data/lib/loggability/loghost.rb +40 -0
- data/lib/loggability/override.rb +171 -0
- data/lib/loggability.rb +49 -77
- data/spec/helpers.rb +116 -0
- data/spec/loggability/formatter/color_spec.rb +3 -6
- data/spec/loggability/formatter/html_spec.rb +3 -6
- data/spec/loggability/formatter_spec.rb +8 -11
- data/spec/loggability/logger_spec.rb +88 -32
- data/spec/loggability/override_spec.rb +134 -0
- data/spec/loggability_spec.rb +162 -57
- data.tar.gz.sig +2 -2
- metadata +23 -5
- metadata.gz.sig +3 -3
- data/spec/lib/helpers.rb +0 -40
@@ -1,14 +1,11 @@
|
|
1
1
|
# -*- rspec -*-
|
2
|
+
#encoding: utf-8
|
2
3
|
|
3
|
-
|
4
|
-
require 'pathname'
|
5
|
-
basedir = Pathname( __FILE__ ).dirname.parent.parent.parent
|
6
|
-
$LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
|
7
|
-
}
|
4
|
+
require_relative '../../helpers'
|
8
5
|
|
9
6
|
require 'tempfile'
|
10
7
|
require 'rspec'
|
11
|
-
|
8
|
+
|
12
9
|
require 'loggability/logger'
|
13
10
|
require 'loggability/formatter'
|
14
11
|
require 'loggability/formatter/color'
|
@@ -1,14 +1,11 @@
|
|
1
1
|
# -*- rspec -*-
|
2
|
+
#encoding: utf-8
|
2
3
|
|
3
|
-
|
4
|
-
require 'pathname'
|
5
|
-
basedir = Pathname( __FILE__ ).dirname.parent.parent.parent
|
6
|
-
$LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
|
7
|
-
}
|
4
|
+
require_relative '../../helpers'
|
8
5
|
|
9
6
|
require 'tempfile'
|
10
7
|
require 'rspec'
|
11
|
-
|
8
|
+
|
12
9
|
require 'loggability/logger'
|
13
10
|
require 'loggability/formatter'
|
14
11
|
require 'loggability/formatter/html'
|
@@ -1,14 +1,10 @@
|
|
1
1
|
# -*- rspec -*-
|
2
2
|
|
3
|
-
|
4
|
-
require 'pathname'
|
5
|
-
basedir = Pathname( __FILE__ ).dirname.parent.parent
|
6
|
-
$LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
|
7
|
-
}
|
3
|
+
require_relative '../helpers'
|
8
4
|
|
9
5
|
require 'tempfile'
|
10
6
|
require 'rspec'
|
11
|
-
|
7
|
+
|
12
8
|
require 'loggability/logger'
|
13
9
|
require 'loggability/formatter'
|
14
10
|
require 'loggability/formatter/default'
|
@@ -18,8 +14,8 @@ describe Loggability::Formatter do
|
|
18
14
|
|
19
15
|
it "formats messages with the pattern it's constructed with" do
|
20
16
|
formatter = Loggability::Formatter.new( '[%5$s] %7$s' )
|
21
|
-
formatter.call( 'INFO', Time.at(1336286481), nil, 'Foom.' )
|
22
|
-
|
17
|
+
result = formatter.call( 'INFO', Time.at(1336286481), nil, 'Foom.' )
|
18
|
+
expect( result ).to match(/\[INFO\] Foom./i)
|
23
19
|
end
|
24
20
|
|
25
21
|
it "formats exceptions into useful messages" do
|
@@ -32,13 +28,14 @@ describe Loggability::Formatter do
|
|
32
28
|
msg = formatter.call( 'INFO', Time.at(1336286481), nil, err )
|
33
29
|
end
|
34
30
|
|
35
|
-
msg.
|
31
|
+
expect( msg ).to match(/\[INFO\] ArgumentError: invalid argument/i)
|
36
32
|
end
|
37
33
|
|
38
34
|
it "formats regular objects into useful messages" do
|
39
35
|
formatter = Loggability::Formatter.new( '[%5$s] %7$s' )
|
40
|
-
formatter.call( 'INFO', Time.at(1336286481), nil, Object.new )
|
41
|
-
|
36
|
+
result = formatter.call( 'INFO', Time.at(1336286481), nil, Object.new )
|
37
|
+
|
38
|
+
expect( result ).to match(/\[INFO\] #<Object:0x[[:xdigit:]]+>/i)
|
42
39
|
end
|
43
40
|
|
44
41
|
end
|
@@ -1,14 +1,10 @@
|
|
1
1
|
# -*- rspec -*-
|
2
2
|
|
3
|
-
|
4
|
-
require 'pathname'
|
5
|
-
basedir = Pathname( __FILE__ ).dirname.parent.parent
|
6
|
-
$LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
|
7
|
-
}
|
3
|
+
require_relative '../helpers'
|
8
4
|
|
9
5
|
require 'tempfile'
|
10
6
|
require 'rspec'
|
11
|
-
|
7
|
+
|
12
8
|
require 'loggability/logger'
|
13
9
|
require 'loggability/formatter'
|
14
10
|
require 'loggability/formatter/default'
|
@@ -32,17 +28,17 @@ describe Loggability::Logger do
|
|
32
28
|
|
33
29
|
|
34
30
|
it "has a less-verbose inspection format than that of its parent" do
|
35
|
-
@logger.inspect.
|
31
|
+
expect( @logger.inspect ).to match( /severity: \S+ formatter: \S+ outputting to: \S+/ )
|
36
32
|
end
|
37
33
|
|
38
34
|
|
39
35
|
it "provides an upgrade constructor for regular Logger objects" do
|
40
36
|
logger = ::Logger.new( $stderr )
|
41
37
|
newlogger = described_class.from_std_logger( logger )
|
42
|
-
newlogger.
|
43
|
-
newlogger.logdev.dev.
|
44
|
-
Loggability::LOG_LEVELS[
|
45
|
-
newlogger.formatter.
|
38
|
+
expect( newlogger ).to be_a( Loggability::Logger )
|
39
|
+
expect( newlogger.logdev.dev ).to be( logger.instance_variable_get(:@logdev).dev )
|
40
|
+
expect( Loggability::LOG_LEVELS[newlogger.level] ).to eq( logger.level )
|
41
|
+
expect( newlogger.formatter ).to be_a( Loggability::Formatter::Default )
|
46
42
|
end
|
47
43
|
|
48
44
|
|
@@ -52,20 +48,60 @@ describe Loggability::Logger do
|
|
52
48
|
@logger.output_to( results )
|
53
49
|
@logger << "This is an appended message."
|
54
50
|
|
55
|
-
results.first.
|
51
|
+
expect( results.first ).to match( /debug.*this is an appended message/i )
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
it "can return a Hash of its current settings" do
|
56
|
+
expect( @logger.settings ).to be_a( Hash )
|
57
|
+
expect( @logger.settings ).to include( :level, :formatter, :logdev )
|
58
|
+
expect( @logger.settings[:level] ).to eq( @logger.level )
|
59
|
+
expect( @logger.settings[:formatter] ).to eq( @logger.formatter )
|
60
|
+
expect( @logger.settings[:logdev] ).to eq( @logger.logdev )
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
it "can restore its settings from a Hash" do
|
65
|
+
settings = @logger.settings
|
66
|
+
|
67
|
+
@logger.level = :fatal
|
68
|
+
@logger.formatter = Loggability::Formatter.create( :html )
|
69
|
+
@logger.output_to( [] )
|
70
|
+
|
71
|
+
@logger.restore_settings( settings )
|
72
|
+
|
73
|
+
expect( @logger.level ).to be( settings[:level] )
|
74
|
+
expect( @logger.formatter ).to be( settings[:formatter] )
|
75
|
+
expect( @logger.logdev ).to be( settings[:logdev] )
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
it "ignores missing keys when restoring its settings from a Hash" do
|
80
|
+
settings = @logger.settings
|
81
|
+
settings.delete( :level )
|
82
|
+
|
83
|
+
@logger.level = :fatal
|
84
|
+
@logger.formatter = Loggability::Formatter.create( :html )
|
85
|
+
@logger.output_to( [] )
|
86
|
+
|
87
|
+
@logger.restore_settings( settings )
|
88
|
+
|
89
|
+
expect( @logger.level ).to be( :fatal )
|
90
|
+
expect( @logger.formatter ).to be( settings[:formatter] )
|
91
|
+
expect( @logger.logdev ).to be( settings[:logdev] )
|
56
92
|
end
|
57
93
|
|
58
94
|
|
59
95
|
describe "severity level API" do
|
60
96
|
|
61
97
|
it "defaults to :warn level" do
|
62
|
-
@logger.level.
|
98
|
+
expect( @logger.level ).to eq( :warn )
|
63
99
|
end
|
64
100
|
|
65
101
|
it "defaults to :debug level when $DEBUG is true" do
|
66
102
|
begin
|
67
103
|
$DEBUG = true
|
68
|
-
described_class.new.level.
|
104
|
+
expect( described_class.new.level ).to eq( :debug )
|
69
105
|
ensure
|
70
106
|
$DEBUG = false
|
71
107
|
end
|
@@ -75,17 +111,17 @@ describe Loggability::Logger do
|
|
75
111
|
newlevel = Logger::DEBUG
|
76
112
|
$stderr.puts "Setting newlevel to %p" % [ newlevel ]
|
77
113
|
@logger.level = newlevel
|
78
|
-
@logger.level.
|
114
|
+
expect( @logger.level ).to eq( :debug )
|
79
115
|
end
|
80
116
|
|
81
117
|
it "allows its levels to be set with Symbolic level names" do
|
82
118
|
@logger.level = :info
|
83
|
-
@logger.level.
|
119
|
+
expect( @logger.level ).to eq( :info )
|
84
120
|
end
|
85
121
|
|
86
122
|
it "allows its levels to be set with Stringish level names" do
|
87
123
|
@logger.level = 'fatal'
|
88
|
-
@logger.level.
|
124
|
+
expect( @logger.level ).to eq( :fatal )
|
89
125
|
end
|
90
126
|
|
91
127
|
end
|
@@ -94,32 +130,50 @@ describe Loggability::Logger do
|
|
94
130
|
describe "log device API" do
|
95
131
|
|
96
132
|
it "logs to STDERR by default" do
|
97
|
-
@logger.logdev.dev.
|
133
|
+
expect( @logger.logdev.dev ).to be( $stderr )
|
98
134
|
end
|
99
135
|
|
100
136
|
it "can be told to log to a file" do
|
101
137
|
tmpfile = Tempfile.new( 'loggability-device-spec' )
|
102
138
|
@logger.output_to( tmpfile.path )
|
103
|
-
@logger.logdev.dev.
|
139
|
+
expect( @logger.logdev.dev ).to be_a( File )
|
104
140
|
end
|
105
141
|
|
106
142
|
it "supports log-rotation arguments for logfiles" do
|
107
143
|
tmpfile = Tempfile.new( 'loggability-device-spec' )
|
108
144
|
@logger.output_to( tmpfile.path, 5, 125000 )
|
109
|
-
@logger.logdev.dev.
|
110
|
-
@logger.logdev.filename.
|
111
|
-
@logger.logdev.instance_variable_get(
|
112
|
-
@logger.logdev.instance_variable_get(
|
145
|
+
expect( @logger.logdev.dev ).to be_a( File )
|
146
|
+
expect( @logger.logdev.filename ).to eq( tmpfile.path )
|
147
|
+
expect( @logger.logdev.instance_variable_get(:@shift_age) ).to eq( 5 )
|
148
|
+
expect( @logger.logdev.instance_variable_get(:@shift_size) ).to eq( 125000 )
|
113
149
|
end
|
114
150
|
|
115
151
|
it "can be told to log to an Array" do
|
116
152
|
logmessages = []
|
117
153
|
@logger.output_to( logmessages )
|
118
|
-
@logger.logdev.
|
154
|
+
expect( @logger.logdev ).to be_a( Loggability::Logger::AppendingLogDevice )
|
119
155
|
@logger.level = :debug
|
120
156
|
@logger.info( "Something happened." )
|
121
|
-
logmessages.
|
122
|
-
logmessages.first.
|
157
|
+
expect( logmessages ).to have( 1 ).member
|
158
|
+
expect( logmessages.first ).to match( /something happened/i )
|
159
|
+
end
|
160
|
+
|
161
|
+
it "doesn't re-wrap a Logger::LogDevice" do
|
162
|
+
tmpfile = Tempfile.new( 'loggability-device-spec' )
|
163
|
+
@logger.output_to( tmpfile.path, 5, 125000 )
|
164
|
+
|
165
|
+
original_logdev = @logger.logdev
|
166
|
+
@logger.output_to( original_logdev )
|
167
|
+
|
168
|
+
expect( @logger.logdev ).to be( original_logdev )
|
169
|
+
end
|
170
|
+
|
171
|
+
it "doesn't re-wrap an AppendingLogDevice" do
|
172
|
+
log_array = []
|
173
|
+
@logger.output_to( log_array )
|
174
|
+
@logger.output_to( @logger.logdev )
|
175
|
+
|
176
|
+
expect( @logger.logdev.target ).to be( log_array )
|
123
177
|
end
|
124
178
|
|
125
179
|
end
|
@@ -128,12 +182,12 @@ describe Loggability::Logger do
|
|
128
182
|
describe "formatter API" do
|
129
183
|
|
130
184
|
it "logs with the default formatter by default" do
|
131
|
-
@logger.formatter.
|
185
|
+
expect( @logger.formatter ).to be_a( Loggability::Formatter::Default )
|
132
186
|
end
|
133
187
|
|
134
188
|
it "can be told to use the default formatter explicitly" do
|
135
189
|
@logger.format_as( :default )
|
136
|
-
@logger.formatter.
|
190
|
+
expect( @logger.formatter ).to be_a( Loggability::Formatter::Default )
|
137
191
|
end
|
138
192
|
|
139
193
|
it "can be told to use a block as a formatter" do
|
@@ -141,12 +195,12 @@ describe Loggability::Logger do
|
|
141
195
|
original_formatter.call(severity, datetime, progname, msg.dump)
|
142
196
|
end
|
143
197
|
|
144
|
-
@logger.formatter.
|
198
|
+
expect( @logger.formatter ).to be_a( Proc )
|
145
199
|
end
|
146
200
|
|
147
201
|
it "can be told to use the HTML formatter" do
|
148
202
|
@logger.format_as( :html )
|
149
|
-
@logger.formatter.
|
203
|
+
expect( @logger.formatter ).to be_a( Loggability::Formatter::HTML )
|
150
204
|
end
|
151
205
|
|
152
206
|
it "supports formatting with ::Logger::Formatter, too" do
|
@@ -155,7 +209,9 @@ describe Loggability::Logger do
|
|
155
209
|
@logger.level = :debug
|
156
210
|
@logger.formatter = ::Logger::Formatter.new
|
157
211
|
@logger.debug "This should work."
|
158
|
-
|
212
|
+
|
213
|
+
expect( output.first ).
|
214
|
+
to match(/D, \[\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d.\d+ #\d+\] DEBUG -- : This should work.\n/)
|
159
215
|
end
|
160
216
|
|
161
217
|
end
|
@@ -176,7 +232,7 @@ describe Loggability::Logger do
|
|
176
232
|
proxy.error( "An error message." )
|
177
233
|
proxy.fatal( "A fatal message." )
|
178
234
|
|
179
|
-
messages.first.
|
235
|
+
expect( messages.first ).to match(/DEBUG \{Object:0x[[:xdigit:]]+\} -- A debug message.\n/i)
|
180
236
|
end
|
181
237
|
|
182
238
|
it "has a terse inspection format" do
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# -*- rspec -*-
|
2
|
+
|
3
|
+
require_relative '../helpers'
|
4
|
+
|
5
|
+
require 'tempfile'
|
6
|
+
require 'rspec'
|
7
|
+
|
8
|
+
require 'loggability/logger'
|
9
|
+
require 'loggability/override'
|
10
|
+
|
11
|
+
|
12
|
+
describe Loggability::Override do
|
13
|
+
|
14
|
+
after( :each ) do
|
15
|
+
Loggability.clear_loghosts
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
let!( :override ) { described_class.new }
|
20
|
+
let!( :loghost ) do
|
21
|
+
Class.new do
|
22
|
+
extend Loggability
|
23
|
+
log_as :testing
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
it "doesn't override anything by default" do
|
29
|
+
previous_level = Loggability[ loghost ].level
|
30
|
+
override.call do
|
31
|
+
expect( Loggability[ loghost ].level ).to be( previous_level )
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
it "raises an error when #called re-entrantly" do
|
37
|
+
override.call do
|
38
|
+
expect { override.call {} }.to raise_error( LocalJumpError )
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
it "can mutate itself into a variant that modifies the logging level" do
|
44
|
+
log = []
|
45
|
+
|
46
|
+
Loggability.level = :fatal
|
47
|
+
Loggability.output_to( log )
|
48
|
+
Loggability.format_with( :default )
|
49
|
+
|
50
|
+
level_override = override.with_level( :debug )
|
51
|
+
|
52
|
+
loghost.logger.debug "This shouldn't show up."
|
53
|
+
level_override.call do
|
54
|
+
loghost.logger.debug "But this should."
|
55
|
+
end
|
56
|
+
loghost.logger.debug "This shouldn't either."
|
57
|
+
|
58
|
+
expect( log ).to have( 1 ).log_entry
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
it "has a constructor delegator for its level mutator" do
|
63
|
+
override = described_class.with_level( :debug )
|
64
|
+
expect( override.settings ).to eq({ level: :debug })
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
it "can mutate itself into a variant that modifies where output goes" do
|
69
|
+
original_destination = []
|
70
|
+
new_destination = []
|
71
|
+
output_override = override.outputting_to( new_destination )
|
72
|
+
|
73
|
+
Loggability.level = :debug
|
74
|
+
Loggability.output_to( original_destination )
|
75
|
+
Loggability.format_with( :default )
|
76
|
+
|
77
|
+
loghost.logger.debug "This should be output to the original destination"
|
78
|
+
output_override.call do
|
79
|
+
loghost.logger.debug "This should be output to the overridden destination"
|
80
|
+
end
|
81
|
+
loghost.logger.debug "This should be output to the original destination"
|
82
|
+
|
83
|
+
expect( original_destination ).to have( 2 ).log_entries
|
84
|
+
expect( new_destination ).to have( 1 ).log_entry
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
it "has a constructor delegator for its output mutator" do
|
89
|
+
log = []
|
90
|
+
override = described_class.outputting_to( log )
|
91
|
+
expect( override.settings ).to eq({ logdev: log })
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
it "can mutate itself into a variant that formats output differently" do
|
96
|
+
log = []
|
97
|
+
Loggability.level = :debug
|
98
|
+
Loggability.output_to( log )
|
99
|
+
Loggability.format_with( :default )
|
100
|
+
|
101
|
+
format_override = override.formatted_with( :html )
|
102
|
+
|
103
|
+
loghost.logger.debug "This should be in the default format"
|
104
|
+
format_override.call do
|
105
|
+
loghost.logger.debug "This should be in the color format"
|
106
|
+
end
|
107
|
+
loghost.logger.debug "This should be in the default format again"
|
108
|
+
|
109
|
+
html_log = log.grep( /<div/ )
|
110
|
+
|
111
|
+
expect( log ).to have( 3 ).entries
|
112
|
+
expect( html_log ).to have( 1 ).entry
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
it "has a constructor delegator for its format mutator" do
|
117
|
+
override = described_class.formatted_with( :color )
|
118
|
+
expect( override.settings ).to eq({ formatter: :color })
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
it "has additive mutators" do
|
123
|
+
override = described_class.
|
124
|
+
formatted_with( :color ).
|
125
|
+
with_level( :debug ).
|
126
|
+
outputting_to( $stdout )
|
127
|
+
|
128
|
+
expect( override.settings[:formatter] ).to be( :color )
|
129
|
+
expect( override.settings[:logdev] ).to be( $stdout )
|
130
|
+
expect( override.settings[:level] ).to be( :debug )
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|