madvertise-logging 0.9.4 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
data/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm use --create ruby-1.9.3-p286@madvertise-logging
1
+ rvm use --create ruby-1.9.3-p392@madvertise-logging
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
@@ -178,10 +178,16 @@ module Madvertise
178
178
 
179
179
  def add(severity, message, attribs = {})
180
180
  severity = severity.is_a?(Symbol) ? self.class.severities[severity] : severity
181
- message = "#{called_from}: #{message}" if @log_caller
182
- message = "[#{@token}] #{message}" if @token
183
- message = "#{message} #{attribs.map{|k,v| "#{k}=#{v.to_s.clean_quote}"}.join(' ')}" if attribs.any?
181
+
182
+ attribs.merge!(called_from) if @log_caller
183
+ attribs.merge!(token: @token) if @token
184
+ attribs = attribs.map do |k,v|
185
+ "#{k}=#{v.to_s.clean_quote}"
186
+ end.join(' ')
187
+
188
+ message = "#{message} #{attribs}" if attribs.length > 0
184
189
  logger.add(severity) { message }
190
+
185
191
  return nil
186
192
  end
187
193
 
@@ -233,8 +239,8 @@ module Madvertise
233
239
  line.match(/(improved_logger|multi_logger)\.rb/).nil?
234
240
  end
235
241
 
236
- file, num, _ = location.split(':')
237
- [ File.basename(file), num ].join(':')
242
+ file, line, _ = location.split(':')
243
+ { :file => file, :line => line }
238
244
  end
239
245
 
240
246
  def create_backend
@@ -1,6 +1,6 @@
1
1
  module Madvertise
2
2
  module Logging
3
3
  # @private
4
- VERSION = "0.9.4"
4
+ VERSION = "1.0.0.rc1"
5
5
  end
6
6
  end
@@ -1,106 +1,71 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
- require 'tempfile'
4
-
5
- include Madvertise::Logging
6
-
7
- RSpec::Matchers.define :have_received_message do |expected|
8
- match do |actual|
9
- @last = IO.readlines(actual).last rescue nil
10
- @last ? @last.match(Regexp.new(expected)) : false
11
- end
12
-
13
- failure_message_for_should do |actual|
14
- "expected #{@last.inspect} to contain #{expected}"
15
- end
16
-
17
- failure_message_for_should_not do |actual|
18
- "expected #{@last.inspect} to not contain #{expected}"
19
- end
20
- end
21
-
22
3
  describe ImprovedLogger do
23
4
 
24
- before(:all) do
25
- Tempfile.new("spec").tap do |tmpfile|
26
- @logfile = tmpfile.path
27
- tmpfile.close
28
- end
29
- end
30
-
31
- after(:all) do
32
- File.unlink(@logfile) rescue nil
33
- end
34
-
35
- before(:each) do
36
- File.unlink(@logfile) rescue nil
37
- @logger = ImprovedLogger.new(@logfile)
38
- @logger.level = :debug
39
- end
5
+ let(:logger) { ImprovedLogger.new(:document) }
40
6
 
41
- subject { @logger }
7
+ before(:each) { logger.level = :debug }
42
8
 
43
- it { should be_a IO }
44
- its(:logger) { should_not be_nil }
9
+ subject { logger.messages }
45
10
 
46
11
  ImprovedLogger.severities.keys.each do |level|
47
12
  describe level do
48
- subject { @logfile }
49
- before { @logger.send(level, "test") }
13
+ before { logger.send(level, "testing #{level}") }
50
14
  let(:prefix) { level == :unknown ? "ANY" : level.to_s.upcase }
51
- it { should have_received_message(/\[#{prefix}\].*test/) }
15
+ it "logs #{level} messages" do
16
+ subject.last[:message].should == "testing #{level}"
17
+ end
52
18
  end
53
19
  end
54
20
 
55
- it "should log info level messages with write and << compat methods" do
56
- @logger << "Info test1"
57
- @logfile.should have_received_message(/\[INFO\].*Info test1/)
58
- @logger.write("Info test2")
59
- @logfile.should have_received_message(/\[INFO\].*Info test2/)
21
+ it "logs info level messages with <<" do
22
+ logger << "Info test <<"
23
+ subject.last[:message].should == "Info test <<"
60
24
  end
61
25
 
62
- it "should support additional attributes" do
63
- @logger.info("foo", key: "value", test: "with space")
64
- @logfile.should have_received_message(/key=value test="with space"/)
26
+ it "logs info level messages with write" do
27
+ logger.write("Info test write")
28
+ subject.last[:message].should == "Info test write"
65
29
  end
66
30
 
67
- it "should support lazy-evaluation via blocks" do
68
- @logger.debug { "debug message" }
69
- @logfile.should have_received_message(/debug message/)
70
- @logger.debug { ["debug message", {key: "value"}] }
71
- @logfile.should have_received_message(/debug message.*key=value/)
31
+ it "supports additional attributes" do
32
+ logger.info("foo", key: "value", test: "with space")
33
+ subject.last[:message].should == 'foo key=value test="with space"'
72
34
  end
73
35
 
74
- it "should accept a different backend" do
75
- l = Logger.new('/dev/null')
76
- @logger.logger = l
77
- @logger.logger.should == l
36
+ it "supports lazy-evaluation via blocks" do
37
+ logger.debug { "debug message" }
38
+ subject.last[:message].should == "debug message"
78
39
  end
79
40
 
80
- it "should support reopening log files" do
81
- @logger.close
82
- FileUtils.rm(@logfile)
83
- @logger.info('Reopen')
84
- @logfile.should have_received_message("Reopen")
41
+ it "supports lazy-evaluation with attributes" do
42
+ logger.debug { ["debug message", {key: "value"}] }
43
+ subject.last[:message].should == "debug message key=value"
44
+ end
45
+
46
+ it "accepts a different backend" do
47
+ l = Logger.new('/dev/null')
48
+ logger.logger = l
49
+ logger.logger.should == l
85
50
  end
86
51
 
87
52
  describe :log_caller do
88
- it "should log the caller file and line number" do
89
- f = File.basename(__FILE__)
53
+ it "logs the caller file and line number" do
54
+ f = __FILE__
90
55
  l = __LINE__ + 3
91
56
 
92
- @logger.log_caller = true
93
- @logger.info("Caller test")
94
- @logfile.should have_received_message("#{f}:#{l}:")
57
+ logger.log_caller = true
58
+ logger.info("Caller test")
59
+ subject.last[:message].should == "Caller test file=#{f} line=#{l}"
95
60
  end
96
61
 
97
- it "should not log the caller file and line number" do
62
+ it "does not log the caller file and line number" do
98
63
  f = File.basename(__FILE__)
99
64
  l = __LINE__ + 3
100
65
 
101
- @logger.log_caller = false
102
- @logger.info("Caller test")
103
- @logfile.should_not have_received_message("#{f}:#{l}:")
66
+ logger.log_caller = false
67
+ logger.info("Caller test")
68
+ subject.last[:message].should_not == "Caller test file=#{f} line=#{l}"
104
69
  end
105
70
  end
106
71
 
@@ -118,44 +83,39 @@ describe ImprovedLogger do
118
83
  end
119
84
  end
120
85
 
121
- subject { @logfile }
122
-
123
- context "with exception object" do
124
- before { @logger.exception(exc) }
125
- it { should have_received_message("exception class=RuntimeError reason=\"Test error\"") }
86
+ it "logs an exception object" do
87
+ logger.exception(exc)
88
+ subject.last[:message].should == "exception class=RuntimeError reason=\"Test error\" message= backtrace=\"['/home/jdoe/app/libexec/app.rb:1:in `foo'']\""
126
89
  end
127
90
 
128
- context "with exception object and prefix" do
129
- before { @logger.exception(exc, "app failed to foo") }
130
- it { should have_received_message("app failed to foo") }
91
+ it "logs an exception object and prefix" do
92
+ logger.exception(exc, "app failed to foo")
93
+ subject.last[:message].should == "exception class=RuntimeError reason=\"Test error\" message=\"app failed to foo\" backtrace=\"['/home/jdoe/app/libexec/app.rb:1:in `foo'']\""
131
94
  end
132
95
  end
133
96
 
134
97
  describe :clean_trace do
135
- subject { @logger.clean_trace(fake_trace) }
98
+ subject { logger.clean_trace(fake_trace) }
136
99
  it { should include("/home/jdoe/app/libexec/app.rb:1:in `foo'") }
137
100
  it { should_not include("/usr/lib/ruby/gems/1.8/gems/madvertise-logging-0.1.0/lib/madvertise/logging/improved_logger.rb:42: in `info'") }
138
101
  end
139
102
 
140
103
  it "should support silencing" do
141
- @logger.silence do |logger|
104
+ logger.silence do |logger|
142
105
  logger.info "This should never be logged"
143
106
  end
144
107
 
145
- @logfile.should_not have_received_message("This should never be logged")
146
-
147
- @logger.info "This should be logged"
148
- @logfile.should have_received_message("This should be logged")
108
+ subject.last.should be_nil
149
109
  end
150
110
 
151
111
  it "should not discard messages if silencer is disabled globally" do
152
112
  ImprovedLogger.silencer = false
153
113
 
154
- @logger.silence do |logger|
114
+ logger.silence do |logger|
155
115
  logger.info "This should actually be logged"
156
116
  end
157
117
 
158
- @logfile.should have_received_message("This should actually be logged")
118
+ subject.last[:message].should == "This should actually be logged"
159
119
 
160
120
  ImprovedLogger.silencer = true
161
121
  end
@@ -163,13 +123,13 @@ describe ImprovedLogger do
163
123
  it "should support a token" do
164
124
  token = "3d5e27f7-b97c-4adc-b1fd-adf1bd4314e0"
165
125
 
166
- @logger.token = token
167
- @logger.info "This should include a token"
168
- @logfile.should have_received_message(token)
126
+ logger.token = token
127
+ logger.info "This should include a token"
128
+ subject.last[:message].should match(token)
169
129
 
170
- @logger.token = nil
171
- @logger.info "This should not include a token"
172
- @logfile.should_not have_received_message(token)
130
+ logger.token = nil
131
+ logger.info "This should not include a token"
132
+ subject.last[:message].should_not match(token)
173
133
  end
174
134
 
175
135
  it "should support save/restore on tokens" do
@@ -178,34 +138,34 @@ describe ImprovedLogger do
178
138
 
179
139
  obj = Object.new
180
140
 
181
- @logger.token = token1
182
- @logger.info "This should include token1"
183
- @logfile.should have_received_message(token1)
141
+ logger.token = token1
142
+ logger.info "This should include token1"
143
+ subject.last[:message].should match(token1)
184
144
 
185
- @logger.save_token(obj)
186
- @logger.token = token2
187
- @logger.info "This should include token2"
188
- @logfile.should have_received_message(token2)
145
+ logger.save_token(obj)
146
+ logger.token = token2
147
+ logger.info "This should include token2"
148
+ subject.last[:message].should match(token2)
189
149
 
190
- @logger.restore_token(obj)
191
- @logger.info "This should include token1"
192
- @logfile.should have_received_message(token1)
150
+ logger.restore_token(obj)
151
+ logger.info "This should include token1"
152
+ subject.last[:message].should match(token1)
193
153
 
194
- @logger.token = nil
195
- @logger.info "This should not include a token"
196
- @logfile.should_not have_received_message(token1)
197
- @logfile.should_not have_received_message(token2)
154
+ logger.token = nil
155
+ logger.info "This should not include a token"
156
+ subject.last[:message].should_not match(token1)
157
+ subject.last[:message].should_not match(token2)
198
158
  end
199
159
 
200
160
  it "should fall back to stderr if logfile is not writable" do
201
161
  $stderr.should_receive(:write).with(/not writable.*STDERR/)
202
162
 
203
163
  @logfile = "/not/writable/spec.log"
204
- @logger = ImprovedLogger.new(@logfile)
205
- @logger.level = :debug
164
+ logger = ImprovedLogger.new(@logfile)
165
+ logger.level = :debug
206
166
 
207
167
  $stderr.should_receive(:write).with(/test/)
208
- @logger.info "test"
168
+ logger.info "test"
209
169
  end
210
170
 
211
171
  it "should fallback to standard logger if syslogger gem is missing" do
@@ -213,50 +173,33 @@ describe ImprovedLogger do
213
173
  $:.replace($: - syslogger_paths)
214
174
 
215
175
  $stderr.should_receive(:write).with(/reverting to STDERR/)
216
- @logger = ImprovedLogger.new(:syslog)
217
- @logger.logger.should be_instance_of(Logger)
176
+ logger = ImprovedLogger.new(:syslog)
177
+ logger.logger.should be_instance_of(Logger)
218
178
 
219
179
  $:.replace($: + syslogger_paths)
220
180
  end
221
181
 
222
182
  context "should behave like write-only IO and" do
223
- it "should close on close_write" do
224
- @logger.should_receive(:close)
225
- @logger.close_write
226
- end
183
+ subject { logger }
227
184
 
228
- its(:flush) { should == @logger }
229
- its(:set_encoding) { should == @logger }
185
+ it { should be_a IO }
186
+ its(:logger) { should_not be_nil }
187
+ its(:flush) { should == logger }
188
+ its(:set_encoding) { should == logger }
230
189
  its(:sync) { should == true }
231
190
  its(:tty?) { should == false }
232
191
 
233
- it "should support printf" do
234
- @logger.printf("%.2f %s", 1.12345, "foo")
235
- @logfile.should have_received_message("1.12 foo")
236
- end
237
-
238
- it "should support print" do
239
- $,, old = ' ', $,
240
- @logger.print("foo", "bar", 123, ["baz", 345])
241
- @logfile.should have_received_message("foo bar 123 baz 345")
242
- $, = old
243
- end
244
-
245
- it "should support puts" do
246
- @logger.puts("a", "b")
247
- @logfile.should have_received_message("b")
248
- @logger.puts(["c", "d"])
249
- @logfile.should have_received_message("d")
250
- @logger.puts(1, 2, 3)
251
- @logfile.should have_received_message("3")
192
+ it "should close on close_write" do
193
+ logger.should_receive(:close)
194
+ logger.close_write
252
195
  end
253
196
 
254
197
  it "should not implement closed?" do
255
- expect { @logger.closed? }.to raise_error(NotImplementedError)
198
+ expect { logger.closed? }.to raise_error(NotImplementedError)
256
199
  end
257
200
 
258
201
  it "should not implement sync=" do
259
- expect { @logger.sync = false }.to raise_error(NotImplementedError)
202
+ expect { logger.sync = false }.to raise_error(NotImplementedError)
260
203
  end
261
204
 
262
205
  it "should implement readbyte, readchar, readline" do
@@ -265,8 +208,8 @@ describe ImprovedLogger do
265
208
  :readchar => :getc,
266
209
  :readline => :gets,
267
210
  }.each do |m, should|
268
- @logger.should_receive(should)
269
- expect { @logger.send(m) }.to raise_error(IOError)
211
+ logger.should_receive(should)
212
+ expect { logger.send(m) }.to raise_error(IOError)
270
213
  end
271
214
  end
272
215
 
@@ -290,23 +233,50 @@ describe ImprovedLogger do
290
233
  :ungetc
291
234
  ].each do |m|
292
235
  it "should raise IOError for method #{m}" do
293
- expect { @logger.send(m) }.to raise_error(IOError)
236
+ expect { logger.send(m) }.to raise_error(IOError)
237
+ end
238
+ end
239
+
240
+ context "print functions" do
241
+ subject { logger.messages }
242
+
243
+ it "should support printf" do
244
+ logger.printf("%.2f %s", 1.12345, "foo")
245
+ subject.last[:message].should == "1.12 foo"
246
+ end
247
+
248
+ it "should support print" do
249
+ $,, old = ' ', $,
250
+ logger.print("foo", "bar", 123, ["baz", 345])
251
+ subject.last[:message].should == "foo bar 123 baz 345"
252
+ $, = old
253
+ end
254
+
255
+ it "should support puts" do
256
+ logger.puts("a", "b")
257
+ subject.last[:message].should == "b"
258
+ logger.puts(["c", "d"])
259
+ subject.last[:message].should == "d"
260
+ logger.puts(1, 2, 3)
261
+ subject.last[:message].should == "3"
294
262
  end
295
263
  end
296
264
  end
297
265
 
298
266
  context "buffer backend" do
299
- before { @logger = ImprovedLogger.new(:buffer) }
267
+ let(:logger) { ImprovedLogger.new(:buffer) }
268
+ subject { logger }
269
+
300
270
  its(:sync) { should == false }
301
271
 
302
272
  it "should support a buffered logger" do
303
- @logger.info "test"
304
- @logger.buffer.should match(/test/)
273
+ logger.info "test"
274
+ logger.buffer.should match(/test/)
305
275
  end
306
276
  end
307
277
 
308
278
  context "document backend" do
309
- before { @logger = ImprovedLogger.new(:document) }
279
+ let(:logger) { ImprovedLogger.new(:document) }
310
280
 
311
281
  before do
312
282
  @msg = "test"
@@ -323,21 +293,22 @@ describe ImprovedLogger do
323
293
  end
324
294
 
325
295
  it "should store all messages as documents" do
326
- @logger.info(@msg)
327
- @logger.messages.first.should == @expected
296
+ logger.info(@msg)
297
+ logger.messages.first.should == @expected
328
298
  end
329
299
 
330
300
  it "should add custom attributes" do
331
301
  attrs = {txid: 1234}
332
- @logger.logger.attrs = attrs
333
- @logger.info(@msg)
334
- @logger.messages.first.should == attrs.merge(@expected)
302
+ logger.logger.attrs = attrs
303
+ logger.info(@msg)
304
+ logger.messages.first.should == attrs.merge(@expected)
335
305
  end
336
306
 
337
307
  end
338
308
 
339
309
  context "syslog backend" do
340
- before { @logger = ImprovedLogger.new(:syslog) }
310
+ let(:logger) { ImprovedLogger.new(:syslog) }
311
+ subject { logger }
341
312
  its(:sync) { should == true }
342
313
  its(:logger) { should be_instance_of(Syslogger) }
343
314
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: madvertise-logging
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
5
- prerelease:
4
+ version: 1.0.0.rc1
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Benedikt Böhm
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-23 00:00:00.000000000 Z
12
+ date: 2013-03-21 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Advanced logging classes with buffer backend, transactions, multi logger,
15
15
  etc
@@ -58,19 +58,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
58
58
  version: '0'
59
59
  segments:
60
60
  - 0
61
- hash: 1370509839467996557
61
+ hash: 438765603245301445
62
62
  required_rubygems_version: !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
- - - ! '>='
65
+ - - ! '>'
66
66
  - !ruby/object:Gem::Version
67
- version: '0'
68
- segments:
69
- - 0
70
- hash: 1370509839467996557
67
+ version: 1.3.1
71
68
  requirements: []
72
69
  rubyforge_project:
73
- rubygems_version: 1.8.24
70
+ rubygems_version: 1.8.25
74
71
  signing_key:
75
72
  specification_version: 3
76
73
  summary: Advanced logging classes with buffer backend, transactions, multi logger,