filterfish-logging 0.9.8
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +176 -0
- data/Manifest.txt +54 -0
- data/README.txt +93 -0
- data/Rakefile +28 -0
- data/data/logging.yaml +63 -0
- data/lib/logging.rb +288 -0
- data/lib/logging/appender.rb +257 -0
- data/lib/logging/appenders/console.rb +43 -0
- data/lib/logging/appenders/email.rb +131 -0
- data/lib/logging/appenders/file.rb +55 -0
- data/lib/logging/appenders/growl.rb +182 -0
- data/lib/logging/appenders/io.rb +81 -0
- data/lib/logging/appenders/rolling_file.rb +293 -0
- data/lib/logging/appenders/syslog.rb +202 -0
- data/lib/logging/config/yaml_configurator.rb +197 -0
- data/lib/logging/layout.rb +103 -0
- data/lib/logging/layouts/basic.rb +35 -0
- data/lib/logging/layouts/pattern.rb +292 -0
- data/lib/logging/log_event.rb +50 -0
- data/lib/logging/logger.rb +388 -0
- data/lib/logging/repository.rb +151 -0
- data/lib/logging/root_logger.rb +60 -0
- data/lib/logging/utils.rb +44 -0
- data/tasks/ann.rake +78 -0
- data/tasks/bones.rake +21 -0
- data/tasks/gem.rake +106 -0
- data/tasks/manifest.rake +49 -0
- data/tasks/notes.rake +22 -0
- data/tasks/post_load.rake +37 -0
- data/tasks/rdoc.rake +49 -0
- data/tasks/rubyforge.rake +57 -0
- data/tasks/setup.rb +253 -0
- data/tasks/svn.rake +45 -0
- data/tasks/test.rake +38 -0
- data/test/appenders/test_console.rb +40 -0
- data/test/appenders/test_email.rb +167 -0
- data/test/appenders/test_file.rb +94 -0
- data/test/appenders/test_growl.rb +115 -0
- data/test/appenders/test_io.rb +113 -0
- data/test/appenders/test_rolling_file.rb +187 -0
- data/test/appenders/test_syslog.rb +192 -0
- data/test/benchmark.rb +88 -0
- data/test/config/test_yaml_configurator.rb +41 -0
- data/test/layouts/test_basic.rb +44 -0
- data/test/layouts/test_pattern.rb +173 -0
- data/test/setup.rb +66 -0
- data/test/test_appender.rb +162 -0
- data/test/test_layout.rb +85 -0
- data/test/test_log_event.rb +81 -0
- data/test/test_logger.rb +589 -0
- data/test/test_logging.rb +250 -0
- data/test/test_repository.rb +123 -0
- data/test/test_root_logger.rb +82 -0
- data/test/test_utils.rb +48 -0
- metadata +126 -0
@@ -0,0 +1,113 @@
|
|
1
|
+
# $Id$
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), %w[.. setup])
|
4
|
+
|
5
|
+
module TestLogging
|
6
|
+
module TestAppenders
|
7
|
+
|
8
|
+
class TestIO < Test::Unit::TestCase
|
9
|
+
include LoggingTestCase
|
10
|
+
|
11
|
+
def setup
|
12
|
+
super
|
13
|
+
::Logging.init
|
14
|
+
@levels = ::Logging::LEVELS
|
15
|
+
|
16
|
+
@sio = StringIO.new
|
17
|
+
@appender = ::Logging::Appenders::IO.new 'test_appender', @sio
|
18
|
+
begin readline rescue EOFError end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_append
|
22
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
|
23
|
+
[1, 2, 3, 4], false)
|
24
|
+
@appender.append event
|
25
|
+
assert_equal " WARN TestLogger : <Array> #{[1, 2, 3, 4]}\n", readline
|
26
|
+
assert_raise(EOFError) {readline}
|
27
|
+
|
28
|
+
event.level = @levels['debug']
|
29
|
+
event.data = 'the big log message'
|
30
|
+
@appender.append event
|
31
|
+
assert_equal "DEBUG TestLogger : the big log message\n", readline
|
32
|
+
assert_raise(EOFError) {readline}
|
33
|
+
|
34
|
+
@appender.close
|
35
|
+
assert_raise(RuntimeError) {@appender.append event}
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_append_error
|
39
|
+
@sio.close
|
40
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
|
41
|
+
[1, 2, 3, 4], false)
|
42
|
+
assert_raise(IOError) {@appender.append event}
|
43
|
+
assert_equal false, @appender.closed?
|
44
|
+
assert_equal 5, @appender.level
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_close
|
48
|
+
assert_equal false, @sio.closed?
|
49
|
+
assert_equal false, @appender.closed?
|
50
|
+
|
51
|
+
@appender.close
|
52
|
+
assert_equal true, @sio.closed?
|
53
|
+
assert_equal true, @appender.closed?
|
54
|
+
|
55
|
+
[STDIN, STDERR, STDOUT].each do |io|
|
56
|
+
@appender = ::Logging::Appenders::IO.new 'test', io
|
57
|
+
@appender.close
|
58
|
+
assert_equal false, io.closed?
|
59
|
+
assert_equal true, @appender.closed?
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_concat
|
64
|
+
@appender << "this is a test message\n"
|
65
|
+
assert_equal "this is a test message\n", readline
|
66
|
+
assert_raise(EOFError) {readline}
|
67
|
+
|
68
|
+
@appender << "this is another message\n"
|
69
|
+
@appender << "some other line\n"
|
70
|
+
assert_equal "this is another message\n", readline
|
71
|
+
assert_equal "some other line\n", readline
|
72
|
+
assert_raise(EOFError) {readline}
|
73
|
+
|
74
|
+
@appender.close
|
75
|
+
assert_raise(RuntimeError) {@appender << 'message'}
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_concat_error
|
79
|
+
@sio.close
|
80
|
+
assert_raise(IOError) {@appender << 'oopsy'}
|
81
|
+
assert_equal false, @appender.closed?
|
82
|
+
assert_equal 5, @appender.level
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_flush
|
86
|
+
ary = []
|
87
|
+
@sio.instance_variable_set :@ary, ary
|
88
|
+
def @sio.flush() @ary << :flush end
|
89
|
+
|
90
|
+
@appender.flush
|
91
|
+
assert_equal :flush, ary.pop
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_initialize
|
95
|
+
assert_raise(EOFError) {@sio.readline}
|
96
|
+
assert_raise(TypeError) {::Logging::Appenders::IO.new 'test', []}
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
def readline
|
101
|
+
@pos ||= 0
|
102
|
+
@sio.seek @pos
|
103
|
+
line = @sio.readline
|
104
|
+
@pos = @sio.tell
|
105
|
+
line
|
106
|
+
end
|
107
|
+
|
108
|
+
end # class TestIO
|
109
|
+
|
110
|
+
end # module TestAppenders
|
111
|
+
end # module TestLogging
|
112
|
+
|
113
|
+
# EOF
|
@@ -0,0 +1,187 @@
|
|
1
|
+
# $Id$
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), %w[.. setup])
|
4
|
+
|
5
|
+
module TestLogging
|
6
|
+
module TestAppenders
|
7
|
+
|
8
|
+
class TestRollingFile < Test::Unit::TestCase
|
9
|
+
include LoggingTestCase
|
10
|
+
|
11
|
+
NAME = 'roller'
|
12
|
+
|
13
|
+
def setup
|
14
|
+
super
|
15
|
+
::Logging.init
|
16
|
+
|
17
|
+
@fn = File.join(TMP, 'test.log')
|
18
|
+
@fn_fmt = File.join(TMP, 'test.%d.log')
|
19
|
+
@glob = File.join(TMP, '*.log')
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_initialize
|
23
|
+
assert_equal [], Dir.glob(@glob)
|
24
|
+
|
25
|
+
# create a new appender
|
26
|
+
ap = ::Logging::Appenders::RollingFile.new(NAME, :filename => @fn)
|
27
|
+
assert File.exist?(@fn)
|
28
|
+
assert_equal 0, File.size(@fn)
|
29
|
+
|
30
|
+
ap << "Just a line of text\n" # 20 bytes
|
31
|
+
ap.flush
|
32
|
+
assert_equal 20, File.size(@fn)
|
33
|
+
cleanup
|
34
|
+
|
35
|
+
# make sure we append to the current file (not truncate)
|
36
|
+
ap = ::Logging::Appenders::RollingFile.new(NAME, :filename => @fn)
|
37
|
+
assert_equal [@fn], Dir.glob(@glob)
|
38
|
+
assert_equal 20, File.size(@fn)
|
39
|
+
|
40
|
+
ap << "Just another line of text\n" # 26 bytes
|
41
|
+
ap.flush
|
42
|
+
assert_equal 46, File.size(@fn)
|
43
|
+
cleanup
|
44
|
+
|
45
|
+
# setting the truncate option to true should roll the current log file
|
46
|
+
# and create a new one
|
47
|
+
ap = ::Logging::Appenders::RollingFile.new(NAME,
|
48
|
+
:filename => @fn, :truncate => true)
|
49
|
+
|
50
|
+
log1 = sprintf(@fn_fmt, 1)
|
51
|
+
assert_equal [log1, @fn], Dir.glob(@glob).sort
|
52
|
+
assert_equal 0, File.size(@fn)
|
53
|
+
assert_equal 46, File.size(log1)
|
54
|
+
|
55
|
+
ap << "Some more text in the new file\n" # 31 bytes
|
56
|
+
ap.flush
|
57
|
+
assert_equal 31, File.size(@fn)
|
58
|
+
cleanup
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_keep
|
62
|
+
assert_equal [], Dir.glob(@glob)
|
63
|
+
|
64
|
+
(1..12).each do |cnt|
|
65
|
+
name = sprintf(@fn_fmt, cnt)
|
66
|
+
File.open(name,'w') {|fd| fd.write 'X'*cnt}
|
67
|
+
end
|
68
|
+
FileUtils.touch(@fn)
|
69
|
+
|
70
|
+
# keep only five files
|
71
|
+
ap = ::Logging::Appenders::RollingFile.new(NAME,
|
72
|
+
:filename => @fn, :keep => 5)
|
73
|
+
|
74
|
+
# we still have 13 files because we did not truncate the log file,
|
75
|
+
# and hence, we did not roll all the log files
|
76
|
+
assert_equal 13, Dir.glob(@glob).length
|
77
|
+
|
78
|
+
# force the appender to roll the files
|
79
|
+
ap.send :roll
|
80
|
+
assert_equal 6, Dir.glob(@glob).length
|
81
|
+
|
82
|
+
(1..5).each do |cnt|
|
83
|
+
name = sprintf(@fn_fmt, cnt)
|
84
|
+
assert_equal cnt-1, File.size(name)
|
85
|
+
end
|
86
|
+
cleanup
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_age
|
90
|
+
assert_equal [], Dir.glob(@glob)
|
91
|
+
|
92
|
+
assert_raise(ArgumentError) do
|
93
|
+
::Logging::Appenders::RollingFile.new(
|
94
|
+
NAME, :filename => @fn, :age => 'bob')
|
95
|
+
end
|
96
|
+
|
97
|
+
ap = ::Logging::Appenders::RollingFile.new(NAME,
|
98
|
+
:filename => @fn, :age => 1)
|
99
|
+
ap << "random message\n"
|
100
|
+
assert_equal 1, Dir.glob(@glob).length
|
101
|
+
|
102
|
+
sleep 1.250
|
103
|
+
ap << "another random message\n"
|
104
|
+
assert_equal 2, Dir.glob(@glob).length
|
105
|
+
|
106
|
+
cleanup
|
107
|
+
ap = ::Logging::Appenders::RollingFile.new(NAME,
|
108
|
+
:filename => @fn, 'age' => 'daily')
|
109
|
+
ap << "random message\n"
|
110
|
+
assert_equal 2, Dir.glob(@glob).length
|
111
|
+
|
112
|
+
age_fn = @fn + '.age'
|
113
|
+
now = ::File.mtime(age_fn)
|
114
|
+
start = now - 3600 * 24
|
115
|
+
::File.utime(start, start, age_fn)
|
116
|
+
|
117
|
+
sleep 0.250
|
118
|
+
ap << "yet another random message\n"
|
119
|
+
assert_equal 3, Dir.glob(@glob).length
|
120
|
+
|
121
|
+
cleanup
|
122
|
+
ap = ::Logging::Appenders::RollingFile.new(NAME,
|
123
|
+
:filename => @fn, :age => 'weekly')
|
124
|
+
ap << "random message\n"
|
125
|
+
assert_equal 3, Dir.glob(@glob).length
|
126
|
+
|
127
|
+
start = now - 3600 * 24 * 7
|
128
|
+
::File.utime(start, start, age_fn)
|
129
|
+
|
130
|
+
sleep 0.250
|
131
|
+
ap << "yet another random message\n"
|
132
|
+
assert_equal 4, Dir.glob(@glob).length
|
133
|
+
|
134
|
+
cleanup
|
135
|
+
ap = ::Logging::Appenders::RollingFile.new(NAME,
|
136
|
+
:filename => @fn, :age => 'monthly')
|
137
|
+
ap << "random message\n"
|
138
|
+
assert_equal 4, Dir.glob(@glob).length
|
139
|
+
|
140
|
+
start = now - 3600 * 24 * 31
|
141
|
+
::File.utime(start, start, age_fn)
|
142
|
+
|
143
|
+
sleep 0.250
|
144
|
+
ap << "yet another random message\n"
|
145
|
+
assert_equal 5, Dir.glob(@glob).length
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_size
|
149
|
+
assert_equal [], Dir.glob(@glob)
|
150
|
+
|
151
|
+
ap = ::Logging::Appenders::RollingFile.new(NAME,
|
152
|
+
:filename => @fn, :size => 100)
|
153
|
+
|
154
|
+
ap << 'X' * 100; ap.flush
|
155
|
+
assert_equal 1, Dir.glob(@glob).length
|
156
|
+
assert_equal 100, File.size(@fn)
|
157
|
+
|
158
|
+
# this character is appended to the log file (bringing its size to 101)
|
159
|
+
# and THEN the file is rolled resulting in a new, empty log file
|
160
|
+
ap << 'X'
|
161
|
+
assert_equal 2, Dir.glob(@glob).length
|
162
|
+
assert_equal 0, File.size(@fn)
|
163
|
+
|
164
|
+
ap << 'X' * 100; ap.flush
|
165
|
+
assert_equal 2, Dir.glob(@glob).length
|
166
|
+
assert_equal 100, File.size(@fn)
|
167
|
+
|
168
|
+
ap << 'X'
|
169
|
+
assert_equal 3, Dir.glob(@glob).length
|
170
|
+
assert_equal 0, File.size(@fn)
|
171
|
+
|
172
|
+
cleanup
|
173
|
+
end
|
174
|
+
|
175
|
+
private
|
176
|
+
def cleanup
|
177
|
+
unless ::Logging::Appender[NAME].nil?
|
178
|
+
::Logging::Appender[NAME].close false
|
179
|
+
::Logging::Appender[NAME] = nil
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
end # class TestRollingFile
|
184
|
+
end # module TestAppenders
|
185
|
+
end # module TestLogging
|
186
|
+
|
187
|
+
# EOF
|
@@ -0,0 +1,192 @@
|
|
1
|
+
# $Id$
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), %w[.. setup])
|
4
|
+
|
5
|
+
if HAVE_SYSLOG
|
6
|
+
|
7
|
+
module TestLogging
|
8
|
+
module TestAppenders
|
9
|
+
|
10
|
+
class TestSyslog < Test::Unit::TestCase
|
11
|
+
include LoggingTestCase
|
12
|
+
include ::Syslog::Constants
|
13
|
+
|
14
|
+
def setup
|
15
|
+
super
|
16
|
+
::Logging.init
|
17
|
+
@levels = ::Logging::LEVELS
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_append
|
21
|
+
return if RUBY_PLATFORM =~ %r/cygwin/
|
22
|
+
|
23
|
+
stderr = IO::pipe
|
24
|
+
|
25
|
+
pid = fork do
|
26
|
+
stderr[0].close
|
27
|
+
STDERR.reopen(stderr[1])
|
28
|
+
stderr[1].close
|
29
|
+
|
30
|
+
appender = create_syslog
|
31
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['info'],
|
32
|
+
[1, 2, 3, 4], false)
|
33
|
+
appender.append event
|
34
|
+
event.level = @levels['debug']
|
35
|
+
event.data = 'the big log message'
|
36
|
+
appender.append event
|
37
|
+
|
38
|
+
appender.level = :warn
|
39
|
+
event.level = @levels['info']
|
40
|
+
event.data = 'this message should not get logged'
|
41
|
+
appender.append event
|
42
|
+
event.level = @levels['warn']
|
43
|
+
event.data = 'this is your last warning'
|
44
|
+
appender.append event
|
45
|
+
|
46
|
+
exit!
|
47
|
+
end
|
48
|
+
|
49
|
+
stderr[1].close
|
50
|
+
Process.waitpid(pid)
|
51
|
+
|
52
|
+
assert_equal("syslog_test: INFO TestLogger : <Array> #{[1,2,3,4]}\n",
|
53
|
+
stderr[0].gets)
|
54
|
+
assert_equal("syslog_test: DEBUG TestLogger : the big log message\n",
|
55
|
+
stderr[0].gets)
|
56
|
+
assert_equal("syslog_test: WARN TestLogger : this is your last warning\n",
|
57
|
+
stderr[0].gets)
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_append_error
|
61
|
+
appender = create_syslog
|
62
|
+
appender.close false
|
63
|
+
|
64
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
|
65
|
+
[1, 2, 3, 4], false)
|
66
|
+
assert_raise(RuntimeError) {appender.append event}
|
67
|
+
assert_equal true, appender.closed?
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_close
|
71
|
+
appender = create_syslog
|
72
|
+
assert_equal false, appender.closed?
|
73
|
+
|
74
|
+
appender.close false
|
75
|
+
assert_equal true, appender.closed?
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_concat
|
79
|
+
return if RUBY_PLATFORM =~ %r/cygwin/
|
80
|
+
|
81
|
+
stderr = IO::pipe
|
82
|
+
|
83
|
+
pid = fork do
|
84
|
+
stderr[0].close
|
85
|
+
STDERR.reopen(stderr[1])
|
86
|
+
stderr[1].close
|
87
|
+
|
88
|
+
appender = create_syslog
|
89
|
+
appender << 'this is a test message'
|
90
|
+
appender << 'this is another message'
|
91
|
+
appender << 'some other line'
|
92
|
+
|
93
|
+
exit!
|
94
|
+
end
|
95
|
+
|
96
|
+
stderr[1].close
|
97
|
+
Process.waitpid(pid)
|
98
|
+
|
99
|
+
assert_equal("syslog_test: this is a test message\n", stderr[0].gets)
|
100
|
+
assert_equal("syslog_test: this is another message\n", stderr[0].gets)
|
101
|
+
assert_equal("syslog_test: some other line\n", stderr[0].gets)
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_concat_error
|
105
|
+
appender = create_syslog
|
106
|
+
appender.close false
|
107
|
+
|
108
|
+
assert_raise(RuntimeError) {appender << 'oopsy'}
|
109
|
+
assert_equal true, appender.closed?
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_map_eq
|
113
|
+
appender = create_syslog
|
114
|
+
|
115
|
+
assert_equal(
|
116
|
+
[LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERR, LOG_CRIT],
|
117
|
+
get_map_from(appender)
|
118
|
+
)
|
119
|
+
|
120
|
+
appender.map = {
|
121
|
+
:debug => LOG_DEBUG,
|
122
|
+
:info => 'LOG_NOTICE',
|
123
|
+
:warn => :LOG_WARNING,
|
124
|
+
:error => 'log_err',
|
125
|
+
:fatal => :log_alert
|
126
|
+
}
|
127
|
+
|
128
|
+
assert_equal(
|
129
|
+
[LOG_DEBUG, LOG_NOTICE, LOG_WARNING, LOG_ERR, LOG_ALERT],
|
130
|
+
get_map_from(appender)
|
131
|
+
)
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_map_eq_error
|
135
|
+
appender = create_syslog
|
136
|
+
|
137
|
+
# Object is not a valid syslog level
|
138
|
+
assert_raise(ArgumentError) do
|
139
|
+
appender.map = {:debug => Object}
|
140
|
+
end
|
141
|
+
|
142
|
+
# there is no syslog level named "info"
|
143
|
+
# it should be "log_info"
|
144
|
+
assert_raise(NameError) do
|
145
|
+
appender.map = {:info => 'lg_info'}
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_initialize_map
|
150
|
+
appender = ::Logging::Appenders::Syslog.new(
|
151
|
+
'syslog_test',
|
152
|
+
:logopt => ::Syslog::LOG_PERROR | ::Syslog::LOG_NDELAY,
|
153
|
+
:map => {
|
154
|
+
:debug => :log_debug,
|
155
|
+
:info => :log_info,
|
156
|
+
:warn => :log_warning,
|
157
|
+
:error => :log_err,
|
158
|
+
:fatal => :log_alert
|
159
|
+
}
|
160
|
+
)
|
161
|
+
|
162
|
+
assert_equal(
|
163
|
+
[LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERR, LOG_ALERT],
|
164
|
+
get_map_from(appender)
|
165
|
+
)
|
166
|
+
end
|
167
|
+
|
168
|
+
|
169
|
+
private
|
170
|
+
|
171
|
+
def create_syslog
|
172
|
+
layout = ::Logging::Layouts::Pattern.new(:pattern => '%5l %c : %m')
|
173
|
+
::Logging::Appenders::Syslog.new(
|
174
|
+
'syslog_test',
|
175
|
+
:logopt => ::Syslog::LOG_PERROR | ::Syslog::LOG_NDELAY,
|
176
|
+
:facility => ::Syslog::LOG_USER,
|
177
|
+
:layout => layout
|
178
|
+
)
|
179
|
+
end
|
180
|
+
|
181
|
+
def get_map_from( syslog )
|
182
|
+
syslog.instance_variable_get :@map
|
183
|
+
end
|
184
|
+
|
185
|
+
end # class TestIO
|
186
|
+
|
187
|
+
end # module TestAppenders
|
188
|
+
end # module TestLogging
|
189
|
+
|
190
|
+
end # HAVE_SYSLOG
|
191
|
+
|
192
|
+
# EOF
|