logging 0.9.4 → 0.9.5
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/History.txt +10 -0
- data/README.rdoc +8 -0
- data/Rakefile +12 -4
- data/lib/logging.rb +5 -1
- data/lib/logging/appender.rb +3 -0
- data/lib/logging/appenders/buffering.rb +167 -0
- data/lib/logging/appenders/email.rb +18 -73
- data/lib/logging/appenders/io.rb +13 -24
- data/lib/logging/layout.rb +0 -3
- data/lib/logging/layouts/pattern.rb +5 -0
- data/lib/logging/logger.rb +13 -13
- data/logging.gemspec +41 -0
- data/tasks/ann.rake +1 -1
- data/tasks/gem.rake +104 -28
- data/tasks/post_load.rake +4 -8
- data/tasks/rubyforge.rake +2 -4
- data/tasks/setup.rb +36 -7
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +3 -0
- data/test/appenders/test_buffered_io.rb +183 -0
- data/test/appenders/test_email.rb +27 -22
- data/test/appenders/test_io.rb +2 -0
- data/test/layouts/test_pattern.rb +5 -0
- data/test/test_layout.rb +9 -9
- metadata +19 -5
- data/Manifest.txt +0 -62
- data/tasks/manifest.rake +0 -48
data/tasks/spec.rake
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
|
2
|
+
if HAVE_SPEC_RAKE_SPECTASK and not PROJ.spec.files.to_a.empty?
|
3
|
+
require 'spec/rake/verify_rcov'
|
4
|
+
|
5
|
+
namespace :spec do
|
6
|
+
|
7
|
+
desc 'Run all specs with basic output'
|
8
|
+
Spec::Rake::SpecTask.new(:run) do |t|
|
9
|
+
t.ruby_opts = PROJ.ruby_opts
|
10
|
+
t.spec_opts = PROJ.spec.opts
|
11
|
+
t.spec_files = PROJ.spec.files
|
12
|
+
t.libs += PROJ.libs
|
13
|
+
end
|
14
|
+
|
15
|
+
desc 'Run all specs with text output'
|
16
|
+
Spec::Rake::SpecTask.new(:specdoc) do |t|
|
17
|
+
t.ruby_opts = PROJ.ruby_opts
|
18
|
+
t.spec_opts = PROJ.spec.opts + ['--format', 'specdoc']
|
19
|
+
t.spec_files = PROJ.spec.files
|
20
|
+
t.libs += PROJ.libs
|
21
|
+
end
|
22
|
+
|
23
|
+
if HAVE_RCOV
|
24
|
+
desc 'Run all specs with RCov'
|
25
|
+
Spec::Rake::SpecTask.new(:rcov) do |t|
|
26
|
+
t.ruby_opts = PROJ.ruby_opts
|
27
|
+
t.spec_opts = PROJ.spec.opts
|
28
|
+
t.spec_files = PROJ.spec.files
|
29
|
+
t.libs += PROJ.libs
|
30
|
+
t.rcov = true
|
31
|
+
t.rcov_dir = PROJ.rcov.dir
|
32
|
+
t.rcov_opts = PROJ.rcov.opts + ['--exclude', 'spec']
|
33
|
+
end
|
34
|
+
|
35
|
+
RCov::VerifyTask.new(:verify) do |t|
|
36
|
+
t.threshold = PROJ.rcov.threshold
|
37
|
+
t.index_html = File.join(PROJ.rcov.dir, 'index.html')
|
38
|
+
t.require_exact_threshold = PROJ.rcov.threshold_exact
|
39
|
+
end
|
40
|
+
|
41
|
+
task :verify => :rcov
|
42
|
+
remove_desc_for_task %w(spec:clobber_rcov)
|
43
|
+
end
|
44
|
+
|
45
|
+
end # namespace :spec
|
46
|
+
|
47
|
+
desc 'Alias to spec:run'
|
48
|
+
task :spec => 'spec:run'
|
49
|
+
|
50
|
+
task :clobber => 'spec:clobber_rcov' if HAVE_RCOV
|
51
|
+
|
52
|
+
end # if HAVE_SPEC_RAKE_SPECTASK
|
53
|
+
|
54
|
+
# EOF
|
data/tasks/svn.rake
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
|
2
|
+
if HAVE_SVN
|
3
|
+
|
4
|
+
unless PROJ.svn.root
|
5
|
+
info = %x/svn info ./
|
6
|
+
m = %r/^Repository Root:\s+(.*)$/.match(info)
|
7
|
+
PROJ.svn.root = (m.nil? ? '' : m[1])
|
8
|
+
end
|
9
|
+
PROJ.svn.root = File.join(PROJ.svn.root, PROJ.svn.path) unless PROJ.svn.path.empty?
|
10
|
+
|
11
|
+
namespace :svn do
|
12
|
+
|
13
|
+
# A prerequisites task that all other tasks depend upon
|
14
|
+
task :prereqs
|
15
|
+
|
16
|
+
desc 'Show tags from the SVN repository'
|
17
|
+
task :show_tags => 'svn:prereqs' do |t|
|
18
|
+
tags = %x/svn list #{File.join(PROJ.svn.root, PROJ.svn.tags)}/
|
19
|
+
tags.gsub!(%r/\/$/, '')
|
20
|
+
tags = tags.split("\n").sort {|a,b| b <=> a}
|
21
|
+
puts tags
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'Create a new tag in the SVN repository'
|
25
|
+
task :create_tag => 'svn:prereqs' do |t|
|
26
|
+
v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
|
27
|
+
abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
|
28
|
+
|
29
|
+
svn = PROJ.svn
|
30
|
+
trunk = File.join(svn.root, svn.trunk)
|
31
|
+
tag = "%s-%s" % [PROJ.name, PROJ.version]
|
32
|
+
tag = File.join(svn.root, svn.tags, tag)
|
33
|
+
msg = "Creating tag for #{PROJ.name} version #{PROJ.version}"
|
34
|
+
|
35
|
+
puts "Creating SVN tag '#{tag}'"
|
36
|
+
unless system "svn cp -m '#{msg}' #{trunk} #{tag}"
|
37
|
+
abort "Tag creation failed"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end # namespace :svn
|
42
|
+
|
43
|
+
task 'gem:release' => 'svn:create_tag'
|
44
|
+
|
45
|
+
end # if PROJ.svn.path
|
46
|
+
|
47
|
+
# EOF
|
data/tasks/test.rake
CHANGED
@@ -0,0 +1,183 @@
|
|
1
|
+
|
2
|
+
require File.join(File.dirname(__FILE__), %w[.. setup])
|
3
|
+
|
4
|
+
module TestLogging
|
5
|
+
module TestAppenders
|
6
|
+
|
7
|
+
class TestBufferedIO < Test::Unit::TestCase
|
8
|
+
include LoggingTestCase
|
9
|
+
|
10
|
+
def setup
|
11
|
+
super
|
12
|
+
::Logging.init
|
13
|
+
@levels = ::Logging::LEVELS
|
14
|
+
|
15
|
+
@sio = StringIO.new
|
16
|
+
@appender = ::Logging::Appenders::IO.new(
|
17
|
+
'test_appender', @sio,
|
18
|
+
:auto_flushing => 3, :immediate_at => :error
|
19
|
+
)
|
20
|
+
|
21
|
+
begin readline rescue EOFError end
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_append
|
25
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
|
26
|
+
[1, 2, 3, 4], false)
|
27
|
+
@appender.append event
|
28
|
+
assert_raise(EOFError) {readline}
|
29
|
+
|
30
|
+
@appender.append event
|
31
|
+
assert_raise(EOFError) {readline}
|
32
|
+
|
33
|
+
event.level = @levels['debug']
|
34
|
+
event.data = 'the big log message'
|
35
|
+
@appender.append event
|
36
|
+
|
37
|
+
assert_equal " WARN TestLogger : <Array> #{[1, 2, 3, 4]}\n", readline
|
38
|
+
assert_equal " WARN TestLogger : <Array> #{[1, 2, 3, 4]}\n", readline
|
39
|
+
assert_equal "DEBUG TestLogger : the big log message\n", readline
|
40
|
+
assert_raise(EOFError) {readline}
|
41
|
+
|
42
|
+
@appender.close
|
43
|
+
assert_raise(RuntimeError) {@appender.append event}
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_append_error
|
47
|
+
# setup an internal logger to capture error messages from the IO
|
48
|
+
# appender
|
49
|
+
log = StringIO.new
|
50
|
+
Logging::Logger[Logging].add_appenders(
|
51
|
+
Logging::Appenders::IO.new('__internal_io', log)
|
52
|
+
)
|
53
|
+
Logging::Logger[Logging].level = 'all'
|
54
|
+
|
55
|
+
|
56
|
+
# close the string IO object so we get an error
|
57
|
+
@sio.close
|
58
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
|
59
|
+
[1, 2, 3, 4], false)
|
60
|
+
@appender.append event
|
61
|
+
log.seek 0
|
62
|
+
assert_raise(EOFError) {log.readline}
|
63
|
+
|
64
|
+
@appender.append event
|
65
|
+
log.seek 0
|
66
|
+
assert_raise(EOFError) {log.readline}
|
67
|
+
|
68
|
+
@appender.append event
|
69
|
+
log.seek 0
|
70
|
+
assert_equal "INFO Logging : appender \"test_appender\" has been disabled", log.readline.strip
|
71
|
+
assert_equal "ERROR Logging : <IOError> not opened for writing", log.readline.strip
|
72
|
+
|
73
|
+
assert_equal false, @appender.closed?
|
74
|
+
assert_equal 5, @appender.level
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_close
|
78
|
+
assert_equal false, @sio.closed?
|
79
|
+
assert_equal false, @appender.closed?
|
80
|
+
|
81
|
+
@appender.close
|
82
|
+
assert_equal true, @sio.closed?
|
83
|
+
assert_equal true, @appender.closed?
|
84
|
+
|
85
|
+
[STDIN, STDERR, STDOUT].each do |io|
|
86
|
+
@appender = ::Logging::Appenders::IO.new 'test', io
|
87
|
+
@appender.close
|
88
|
+
assert_equal false, io.closed?
|
89
|
+
assert_equal true, @appender.closed?
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_concat
|
94
|
+
@appender << "this is a test message\n"
|
95
|
+
assert_raise(EOFError) {readline}
|
96
|
+
|
97
|
+
@appender << "this is another message\n"
|
98
|
+
assert_raise(EOFError) {readline}
|
99
|
+
|
100
|
+
@appender << "some other line\n"
|
101
|
+
|
102
|
+
assert_equal "this is a test message\n", readline
|
103
|
+
assert_equal "this is another message\n", readline
|
104
|
+
assert_equal "some other line\n", readline
|
105
|
+
assert_raise(EOFError) {readline}
|
106
|
+
|
107
|
+
@appender.close
|
108
|
+
assert_raise(RuntimeError) {@appender << 'message'}
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_concat_error
|
112
|
+
# setup an internal logger to capture error messages from the IO
|
113
|
+
# appender
|
114
|
+
log = StringIO.new
|
115
|
+
Logging::Logger[Logging].add_appenders(
|
116
|
+
Logging::Appenders::IO.new('__internal_io', log)
|
117
|
+
)
|
118
|
+
Logging::Logger[Logging].level = 'all'
|
119
|
+
|
120
|
+
# close the string IO object so we get an error
|
121
|
+
@sio.close
|
122
|
+
@appender << 'oopsy'
|
123
|
+
log.seek 0
|
124
|
+
assert_raise(EOFError) {log.readline}
|
125
|
+
|
126
|
+
@appender << 'whoopsy'
|
127
|
+
log.seek 0
|
128
|
+
assert_raise(EOFError) {log.readline}
|
129
|
+
|
130
|
+
@appender << 'pooh'
|
131
|
+
log.seek 0
|
132
|
+
assert_equal "INFO Logging : appender \"test_appender\" has been disabled", log.readline.strip
|
133
|
+
assert_equal "ERROR Logging : <IOError> not opened for writing", log.readline.strip
|
134
|
+
|
135
|
+
# and the appender does not close itself
|
136
|
+
assert_equal false, @appender.closed?
|
137
|
+
assert_equal 5, @appender.level
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_flush
|
141
|
+
ary = []
|
142
|
+
@sio.instance_variable_set :@ary, ary
|
143
|
+
def @sio.flush() @ary << :flush end
|
144
|
+
|
145
|
+
@appender << "this is a test message\n"
|
146
|
+
assert_raise(EOFError) {readline}
|
147
|
+
|
148
|
+
@appender.flush
|
149
|
+
assert_equal :flush, ary.pop
|
150
|
+
assert_equal "this is a test message\n", readline
|
151
|
+
assert_raise(EOFError) {readline}
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_immediate_at
|
155
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
|
156
|
+
[1, 2, 3, 4], false)
|
157
|
+
@appender.append event
|
158
|
+
assert_raise(EOFError) {readline}
|
159
|
+
|
160
|
+
event.level = @levels['error']
|
161
|
+
event.data = 'an error message'
|
162
|
+
@appender.append event
|
163
|
+
|
164
|
+
assert_equal " WARN TestLogger : <Array> #{[1, 2, 3, 4]}\n", readline
|
165
|
+
assert_equal "ERROR TestLogger : an error message\n", readline
|
166
|
+
assert_raise(EOFError) {readline}
|
167
|
+
end
|
168
|
+
|
169
|
+
private
|
170
|
+
def readline
|
171
|
+
@pos ||= 0
|
172
|
+
@sio.seek @pos
|
173
|
+
line = @sio.readline
|
174
|
+
@pos = @sio.tell
|
175
|
+
line
|
176
|
+
end
|
177
|
+
|
178
|
+
end # class TestBufferedIO
|
179
|
+
|
180
|
+
end # module TestAppenders
|
181
|
+
end # module TestLogging
|
182
|
+
|
183
|
+
# EOF
|
@@ -22,7 +22,7 @@ module TestAppenders
|
|
22
22
|
|
23
23
|
@appender = ::Logging::Appenders::Email.new('email',
|
24
24
|
'from' => 'me', 'to' => 'you',
|
25
|
-
:
|
25
|
+
:buffer_size => '3', :immediate_at => 'error, fatal',
|
26
26
|
:domain => 'test.logging', :acct => 'test', :passwd => 'test'
|
27
27
|
)
|
28
28
|
end
|
@@ -42,7 +42,7 @@ module TestAppenders
|
|
42
42
|
'from' => 'me', 'to' => 'you'
|
43
43
|
)
|
44
44
|
|
45
|
-
assert_equal(100, appender.
|
45
|
+
assert_equal(100, appender.auto_flushing)
|
46
46
|
assert_equal([], appender.instance_variable_get(:@immediate))
|
47
47
|
assert_equal('localhost', appender.server)
|
48
48
|
assert_equal(25, appender.port)
|
@@ -64,7 +64,7 @@ module TestAppenders
|
|
64
64
|
|
65
65
|
assert_equal('lbrinn@gmail.com', appender.instance_variable_get(:@from))
|
66
66
|
assert_equal(['everyone'], appender.instance_variable_get(:@to))
|
67
|
-
assert_equal(1000, appender.
|
67
|
+
assert_equal(1000, appender.auto_flushing)
|
68
68
|
assert_equal('1234', appender.instance_variable_get(:@passwd))
|
69
69
|
assert_equal([nil, nil, nil, true, true],
|
70
70
|
appender.instance_variable_get(:@immediate))
|
@@ -74,27 +74,32 @@ module TestAppenders
|
|
74
74
|
assert_equal('lbrinn', appender.acct)
|
75
75
|
assert_equal(:tls, appender.authtype)
|
76
76
|
assert_equal("I'm rich and you're not", appender.subject)
|
77
|
+
|
78
|
+
appender = ::Logging::Appenders::Email.new('email',
|
79
|
+
'from' => 'me', 'to' => 'you', :auto_flushing => 42
|
80
|
+
)
|
81
|
+
assert_equal(42, appender.auto_flushing)
|
77
82
|
end
|
78
83
|
|
79
84
|
def test_append
|
80
|
-
# with
|
85
|
+
# with auto_flushing enabled, mail will be sent each time a log event
|
81
86
|
# occurs
|
82
|
-
@appender.
|
87
|
+
@appender.auto_flushing = true
|
83
88
|
event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
|
84
89
|
[1, 2, 3, 4], false)
|
85
90
|
@appender.append event
|
86
91
|
assert_not_equal(@levels.length, @appender.level)
|
87
|
-
assert_equal(0, @appender.
|
92
|
+
assert_equal(0, @appender.buffer.length)
|
88
93
|
|
89
94
|
# increase the buffer size and log a few events
|
90
|
-
@appender.
|
95
|
+
@appender.auto_flushing = 3
|
91
96
|
@appender.append event
|
92
97
|
@appender.append event
|
93
|
-
assert_equal(2, @appender.
|
98
|
+
assert_equal(2, @appender.buffer.length)
|
94
99
|
|
95
100
|
@appender.append event
|
96
101
|
assert_not_equal(@levels.length, @appender.level)
|
97
|
-
assert_equal(0, @appender.
|
102
|
+
assert_equal(0, @appender.buffer.length)
|
98
103
|
|
99
104
|
# error and fatal messages should be send immediately (no buffering)
|
100
105
|
error = ::Logging::LogEvent.new('ErrLogger', @levels['error'],
|
@@ -105,33 +110,33 @@ module TestAppenders
|
|
105
110
|
@appender.append event
|
106
111
|
@appender.append fatal
|
107
112
|
assert_not_equal(@levels.length, @appender.level)
|
108
|
-
assert_equal(0, @appender.
|
113
|
+
assert_equal(0, @appender.buffer.length)
|
109
114
|
|
110
115
|
@appender.append error
|
111
116
|
assert_not_equal(@levels.length, @appender.level)
|
112
|
-
assert_equal(0, @appender.
|
117
|
+
assert_equal(0, @appender.buffer.length)
|
113
118
|
|
114
119
|
@appender.append event
|
115
|
-
assert_equal(1, @appender.
|
120
|
+
assert_equal(1, @appender.buffer.length)
|
116
121
|
end
|
117
122
|
|
118
123
|
def test_concat
|
119
|
-
# with
|
124
|
+
# with auto_flushing enabled, mail will be sent each time a log event
|
120
125
|
# occurs
|
121
|
-
@appender.
|
126
|
+
@appender.auto_flushing = true
|
122
127
|
@appender << 'test message'
|
123
128
|
assert_not_equal(@levels.length, @appender.level)
|
124
|
-
assert_equal(0, @appender.
|
129
|
+
assert_equal(0, @appender.buffer.length)
|
125
130
|
|
126
131
|
# increase the buffer size and log a few events
|
127
|
-
@appender.
|
132
|
+
@appender.auto_flushing = 3
|
128
133
|
@appender << 'another test message'
|
129
134
|
@appender << 'a second test message'
|
130
|
-
assert_equal(2, @appender.
|
135
|
+
assert_equal(2, @appender.buffer.length)
|
131
136
|
|
132
137
|
@appender << 'a third test message'
|
133
138
|
assert_not_equal(@levels.length, @appender.level)
|
134
|
-
assert_equal(0, @appender.
|
139
|
+
assert_equal(0, @appender.buffer.length)
|
135
140
|
end
|
136
141
|
|
137
142
|
def test_flush
|
@@ -139,11 +144,11 @@ module TestAppenders
|
|
139
144
|
[1, 2, 3, 4], false)
|
140
145
|
@appender.append event
|
141
146
|
@appender << 'test message'
|
142
|
-
assert_equal(2, @appender.
|
147
|
+
assert_equal(2, @appender.buffer.length)
|
143
148
|
|
144
149
|
@appender.flush
|
145
150
|
assert_not_equal(@levels.length, @appender.level)
|
146
|
-
assert_equal(0, @appender.
|
151
|
+
assert_equal(0, @appender.buffer.length)
|
147
152
|
end
|
148
153
|
|
149
154
|
def test_close
|
@@ -151,11 +156,11 @@ module TestAppenders
|
|
151
156
|
[1, 2, 3, 4], false)
|
152
157
|
@appender.append event
|
153
158
|
@appender << 'test message'
|
154
|
-
assert_equal(2, @appender.
|
159
|
+
assert_equal(2, @appender.buffer.length)
|
155
160
|
|
156
161
|
@appender.close
|
157
162
|
assert_not_equal(@levels.length, @appender.level)
|
158
|
-
assert_equal(0, @appender.
|
163
|
+
assert_equal(0, @appender.buffer.length)
|
159
164
|
assert(@appender.closed?)
|
160
165
|
end
|
161
166
|
|
data/test/appenders/test_io.rb
CHANGED
@@ -51,6 +51,7 @@ module TestAppenders
|
|
51
51
|
@appender.append event
|
52
52
|
|
53
53
|
log.seek 0
|
54
|
+
assert_equal "INFO Logging : appender \"test_appender\" has been disabled", log.readline.strip
|
54
55
|
assert_equal "ERROR Logging : <IOError> not opened for writing", log.readline.strip
|
55
56
|
|
56
57
|
assert_equal false, @appender.closed?
|
@@ -102,6 +103,7 @@ module TestAppenders
|
|
102
103
|
@appender << 'oopsy'
|
103
104
|
|
104
105
|
log.seek 0
|
106
|
+
assert_equal "INFO Logging : appender \"test_appender\" has been disabled", log.readline.strip
|
105
107
|
assert_equal "ERROR Logging : <IOError> not opened for writing", log.readline.strip
|
106
108
|
|
107
109
|
# and the appender does not close itself
|