filterfish-logging 0.9.8

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.
Files changed (55) hide show
  1. data/History.txt +176 -0
  2. data/Manifest.txt +54 -0
  3. data/README.txt +93 -0
  4. data/Rakefile +28 -0
  5. data/data/logging.yaml +63 -0
  6. data/lib/logging.rb +288 -0
  7. data/lib/logging/appender.rb +257 -0
  8. data/lib/logging/appenders/console.rb +43 -0
  9. data/lib/logging/appenders/email.rb +131 -0
  10. data/lib/logging/appenders/file.rb +55 -0
  11. data/lib/logging/appenders/growl.rb +182 -0
  12. data/lib/logging/appenders/io.rb +81 -0
  13. data/lib/logging/appenders/rolling_file.rb +293 -0
  14. data/lib/logging/appenders/syslog.rb +202 -0
  15. data/lib/logging/config/yaml_configurator.rb +197 -0
  16. data/lib/logging/layout.rb +103 -0
  17. data/lib/logging/layouts/basic.rb +35 -0
  18. data/lib/logging/layouts/pattern.rb +292 -0
  19. data/lib/logging/log_event.rb +50 -0
  20. data/lib/logging/logger.rb +388 -0
  21. data/lib/logging/repository.rb +151 -0
  22. data/lib/logging/root_logger.rb +60 -0
  23. data/lib/logging/utils.rb +44 -0
  24. data/tasks/ann.rake +78 -0
  25. data/tasks/bones.rake +21 -0
  26. data/tasks/gem.rake +106 -0
  27. data/tasks/manifest.rake +49 -0
  28. data/tasks/notes.rake +22 -0
  29. data/tasks/post_load.rake +37 -0
  30. data/tasks/rdoc.rake +49 -0
  31. data/tasks/rubyforge.rake +57 -0
  32. data/tasks/setup.rb +253 -0
  33. data/tasks/svn.rake +45 -0
  34. data/tasks/test.rake +38 -0
  35. data/test/appenders/test_console.rb +40 -0
  36. data/test/appenders/test_email.rb +167 -0
  37. data/test/appenders/test_file.rb +94 -0
  38. data/test/appenders/test_growl.rb +115 -0
  39. data/test/appenders/test_io.rb +113 -0
  40. data/test/appenders/test_rolling_file.rb +187 -0
  41. data/test/appenders/test_syslog.rb +192 -0
  42. data/test/benchmark.rb +88 -0
  43. data/test/config/test_yaml_configurator.rb +41 -0
  44. data/test/layouts/test_basic.rb +44 -0
  45. data/test/layouts/test_pattern.rb +173 -0
  46. data/test/setup.rb +66 -0
  47. data/test/test_appender.rb +162 -0
  48. data/test/test_layout.rb +85 -0
  49. data/test/test_log_event.rb +81 -0
  50. data/test/test_logger.rb +589 -0
  51. data/test/test_logging.rb +250 -0
  52. data/test/test_repository.rb +123 -0
  53. data/test/test_root_logger.rb +82 -0
  54. data/test/test_utils.rb +48 -0
  55. metadata +126 -0
@@ -0,0 +1,250 @@
1
+ # $Id$
2
+
3
+ require File.join(File.dirname(__FILE__), %w[setup])
4
+
5
+ module TestLogging
6
+
7
+ class TestLogging < Test::Unit::TestCase
8
+ include LoggingTestCase
9
+
10
+ def setup
11
+ super
12
+ @levels = ::Logging::LEVELS
13
+ @lnames = ::Logging::LNAMES
14
+
15
+ @fn = File.join(TMP, 'test.log')
16
+ @glob = File.join(TMP, '*.log')
17
+ end
18
+
19
+ def test_configure
20
+ assert_raise(ArgumentError) {::Logging.configure 'blah.txt'}
21
+
22
+ ::Logging.configure 'data/logging.yaml'
23
+
24
+ names = {
25
+ 0 => 'DEB', 1 => 'INF', 2 => 'PRT',
26
+ 3 => 'WRN', 4 => 'ERR', 5 => 'FAT'
27
+ }
28
+ assert_equal names, ::Logging::LNAMES
29
+ assert_equal :inspect, ::Logging::OBJ_FORMAT
30
+ assert_equal 3, ::Logging::Logger.root.level
31
+
32
+ # verify the appenders
33
+ h = ::Logging::Appender.instance_variable_get :@appenders
34
+ assert_equal ['logfile', 'stderr'], h.keys.sort
35
+
36
+ # start with the File appender
37
+ logfile = ::Logging::Appender['logfile']
38
+ assert_instance_of ::Logging::Appenders::File, logfile
39
+ assert_equal 0, logfile.level
40
+ assert_equal 'tmp/temp.log', logfile.instance_variable_get(:@fn)
41
+
42
+ layout = logfile.layout
43
+ assert_instance_of ::Logging::Layouts::Pattern, layout
44
+ assert_equal '[%d] %l %c : %m\\n', layout.pattern
45
+ assert_equal 'to_s', layout.date_method
46
+ assert_nil layout.date_pattern
47
+
48
+ # and now the Stderr appender
49
+ stderr = ::Logging::Appender['stderr']
50
+ assert_instance_of ::Logging::Appenders::Stderr, stderr
51
+ assert_equal 0, stderr.level
52
+
53
+ layout = stderr.layout
54
+ assert_instance_of ::Logging::Layouts::Basic, layout
55
+
56
+ # verify the loggers
57
+ h = ::Logging::Repository.instance.instance_variable_get :@h
58
+ assert_equal 3, h.length
59
+
60
+ # mylogger
61
+ mylogger = ::Logging::Logger['mylogger']
62
+ assert_equal 0, mylogger.level
63
+ assert_equal false, mylogger.additive
64
+ assert_equal false, mylogger.trace
65
+
66
+ appenders = mylogger.instance_variable_get :@appenders
67
+ assert_equal 2, appenders.length
68
+ assert_equal ['logfile', 'stderr'], appenders.map {|a| a.name}.sort
69
+
70
+ # yourlogger
71
+ yourlogger = ::Logging::Logger['yourlogger']
72
+ assert_equal 1, yourlogger.level
73
+ assert_equal true, yourlogger.additive
74
+ assert_equal false, yourlogger.trace
75
+
76
+ appenders = yourlogger.instance_variable_get :@appenders
77
+ assert_equal 2, appenders.length
78
+ assert_equal ['logfile', 'stderr'], appenders.map {|a| a.name}.sort
79
+ end
80
+
81
+ def test_logger
82
+ assert_raise(TypeError) {::Logging.logger []}
83
+
84
+ logger = ::Logging.logger STDOUT
85
+ assert_match %r/\A-?\d+\z/, logger.name
86
+ assert_same logger, ::Logging.logger(STDOUT)
87
+
88
+ logger.close
89
+ assert !STDOUT.closed?
90
+
91
+ assert !File.exist?(@fn)
92
+ fd = File.new @fn, 'w'
93
+ logger = ::Logging.logger fd, 2, 100
94
+ assert_equal @fn, logger.name
95
+ logger.debug 'this is a debug message'
96
+ logger.warn 'this is a warning message'
97
+ logger.error 'and now we should have over 100 bytes of data ' +
98
+ 'in the log file'
99
+ logger.info 'but the log file should not roll since we provided ' +
100
+ 'a file descriptor -- not a file name'
101
+ logger.close
102
+ assert fd.closed?
103
+ assert File.exist?(@fn)
104
+ assert_equal 1, Dir.glob(@glob).length
105
+
106
+ FileUtils.rm_f @fn
107
+ assert !File.exist?(@fn)
108
+ logger = ::Logging.logger @fn, 2, 100
109
+ assert File.exist?(@fn)
110
+ assert_equal @fn, logger.name
111
+ logger.debug 'this is a debug message'
112
+ logger.warn 'this is a warning message'
113
+ logger.error 'and now we should have over 100 bytes of data ' +
114
+ 'in the log file'
115
+ logger.info 'but the log file should not roll since we provided ' +
116
+ 'a file descriptor -- not a file name'
117
+ logger.close
118
+ assert_equal 3, Dir.glob(@glob).length
119
+ end
120
+
121
+ def test_init_default
122
+ empty = {}
123
+ assert_equal empty, @levels
124
+ assert_equal empty, @lnames
125
+ assert_same false, ::Logging.const_defined?(:MAX_LEVEL_LENGTH)
126
+
127
+ ::Logging::Repository.instance
128
+
129
+ assert_equal 5, @levels.length
130
+ assert_equal 5, @lnames.length
131
+ assert_equal 5, ::Logging::MAX_LEVEL_LENGTH
132
+
133
+ assert_equal 0, @levels['debug']
134
+ assert_equal 1, @levels['info']
135
+ assert_equal 2, @levels['warn']
136
+ assert_equal 3, @levels['error']
137
+ assert_equal 4, @levels['fatal']
138
+
139
+ assert_equal 'DEBUG', @lnames[0]
140
+ assert_equal 'INFO', @lnames[1]
141
+ assert_equal 'WARN', @lnames[2]
142
+ assert_equal 'ERROR', @lnames[3]
143
+ assert_equal 'FATAL', @lnames[4]
144
+ end
145
+
146
+ def test_init_special
147
+ empty = {}
148
+ assert_equal empty, @levels
149
+ assert_equal empty, @lnames
150
+ assert_same false, ::Logging.const_defined?(:MAX_LEVEL_LENGTH)
151
+
152
+ assert_raise(ArgumentError) {::Logging.init(1, 2, 3, 4)}
153
+
154
+ ::Logging.init :one, 'two', :THREE, 'FoUr', :sIx
155
+
156
+ assert_equal 5, @levels.length
157
+ assert_equal 5, @lnames.length
158
+ assert_equal 5, ::Logging::MAX_LEVEL_LENGTH
159
+
160
+ assert_equal 0, @levels['one']
161
+ assert_equal 1, @levels['two']
162
+ assert_equal 2, @levels['three']
163
+ assert_equal 3, @levels['four']
164
+ assert_equal 4, @levels['six']
165
+
166
+ assert_equal 'ONE', @lnames[0]
167
+ assert_equal 'TWO', @lnames[1]
168
+ assert_equal 'THREE', @lnames[2]
169
+ assert_equal 'FOUR', @lnames[3]
170
+ assert_equal 'SIX', @lnames[4]
171
+ end
172
+
173
+ def test_init_all_off
174
+ empty = {}
175
+ assert_equal empty, @levels
176
+ assert_equal empty, @lnames
177
+ assert_same false, ::Logging.const_defined?(:MAX_LEVEL_LENGTH)
178
+
179
+ ::Logging.init %w(a b all c off d)
180
+
181
+ assert_equal 4, @levels.length
182
+ assert_equal 4, @lnames.length
183
+ assert_equal 1, ::Logging::MAX_LEVEL_LENGTH
184
+
185
+ assert_equal 0, @levels['a']
186
+ assert_equal 1, @levels['b']
187
+ assert_equal 2, @levels['c']
188
+ assert_equal 3, @levels['d']
189
+
190
+ assert_equal 'A', @lnames[0]
191
+ assert_equal 'B', @lnames[1]
192
+ assert_equal 'C', @lnames[2]
193
+ assert_equal 'D', @lnames[3]
194
+ end
195
+
196
+ def test_format_as
197
+ assert_equal false, ::Logging.const_defined?('OBJ_FORMAT')
198
+
199
+ assert_raises(ArgumentError) {::Logging.format_as 'bob'}
200
+ assert_raises(ArgumentError) {::Logging.format_as String}
201
+ assert_raises(ArgumentError) {::Logging.format_as :what?}
202
+
203
+ remove_const = lambda do |const|
204
+ ::Logging.class_eval {remove_const const if const_defined? const}
205
+ end
206
+
207
+ ::Logging.format_as :string
208
+ assert ::Logging.const_defined?('OBJ_FORMAT')
209
+ assert_equal :string, ::Logging::OBJ_FORMAT
210
+ remove_const[:OBJ_FORMAT]
211
+
212
+ ::Logging.format_as :inspect
213
+ assert ::Logging.const_defined?('OBJ_FORMAT')
214
+ assert_equal :inspect, ::Logging::OBJ_FORMAT
215
+ remove_const[:OBJ_FORMAT]
216
+
217
+ ::Logging.format_as :yaml
218
+ assert ::Logging.const_defined?('OBJ_FORMAT')
219
+ assert_equal :yaml, ::Logging::OBJ_FORMAT
220
+ remove_const[:OBJ_FORMAT]
221
+
222
+ ::Logging.format_as 'string'
223
+ assert ::Logging.const_defined?('OBJ_FORMAT')
224
+ assert_equal :string, ::Logging::OBJ_FORMAT
225
+ remove_const[:OBJ_FORMAT]
226
+
227
+ ::Logging.format_as 'inspect'
228
+ assert ::Logging.const_defined?('OBJ_FORMAT')
229
+ assert_equal :inspect, ::Logging::OBJ_FORMAT
230
+ remove_const[:OBJ_FORMAT]
231
+
232
+ ::Logging.format_as 'yaml'
233
+ assert ::Logging.const_defined?('OBJ_FORMAT')
234
+ assert_equal :yaml, ::Logging::OBJ_FORMAT
235
+ remove_const[:OBJ_FORMAT]
236
+ end
237
+
238
+ def test_path
239
+ path = ::Logging.path(*%w[one two three])
240
+ assert_match %r/one\/two\/three$/, path
241
+ end
242
+
243
+ def test_version
244
+ assert_match %r/\d+\.\d+\.\d+/, ::Logging.version
245
+ end
246
+
247
+ end # class TestLogging
248
+ end # module TestLogging
249
+
250
+ # EOF
@@ -0,0 +1,123 @@
1
+ # $Id$
2
+
3
+ require File.join(File.dirname(__FILE__), %w[setup])
4
+
5
+ module TestLogging
6
+
7
+ class TestRepository < Test::Unit::TestCase
8
+ include LoggingTestCase
9
+
10
+ def setup
11
+ super
12
+ @repo = ::Logging::Repository.instance
13
+ end
14
+
15
+ def test_instance
16
+ assert_same @repo, ::Logging::Repository.instance
17
+ end
18
+
19
+ def test_aref
20
+ root = @repo[:root]
21
+ assert_same root, @repo[:root]
22
+
23
+ a = []
24
+ ::Logging::Logger.new a
25
+ assert_same @repo['Array'], @repo[Array]
26
+ assert_same @repo['Array'], @repo[a]
27
+
28
+ assert_not_same @repo['Array'], @repo[:root]
29
+
30
+ ::Logging::Logger.new 'A'
31
+ ::Logging::Logger.new 'A::B'
32
+ assert_not_same @repo['A'], @repo['A::B']
33
+ end
34
+
35
+ def test_aset
36
+ root = @repo[:root]
37
+ @repo[:root] = 'root'
38
+ assert_not_same root, @repo[:root]
39
+
40
+ assert_nil @repo['blah']
41
+ @repo['blah'] = 'root'
42
+ assert_equal 'root', @repo['blah']
43
+ end
44
+
45
+ def test_fetch
46
+ assert @repo.has_logger?(:root)
47
+ assert_same @repo[:root], @repo.fetch(:root)
48
+
49
+ assert !@repo.has_logger?('A')
50
+ assert_raise(KeyError) {@repo.fetch 'A'}
51
+
52
+ %w(A A::B A::B::C::D A::B::C::E A::B::C::F).each do |name|
53
+ ::Logging::Logger.new(name)
54
+ end
55
+
56
+ assert @repo.has_logger?('A')
57
+ assert @repo.has_logger?('A::B')
58
+ end
59
+
60
+ def test_parent
61
+ %w(A A::B A::B::C::D A::B::C::E A::B::C::F).each do |name|
62
+ ::Logging::Logger.new(name)
63
+ end
64
+
65
+ assert_same @repo[:root], @repo.parent('A')
66
+ assert_same @repo['A'], @repo.parent('A::B')
67
+ assert_same @repo['A::B'], @repo.parent('A::B::C')
68
+ assert_same @repo['A::B'], @repo.parent('A::B::C::D')
69
+ assert_same @repo['A::B'], @repo.parent('A::B::C::E')
70
+ assert_same @repo['A::B'], @repo.parent('A::B::C::F')
71
+
72
+ ::Logging::Logger.new('A::B::C')
73
+
74
+ assert_same @repo['A::B'], @repo.parent('A::B::C')
75
+ assert_same @repo['A::B::C'], @repo.parent('A::B::C::D')
76
+ assert_same @repo['A::B::C'], @repo.parent('A::B::C::E')
77
+ assert_same @repo['A::B::C'], @repo.parent('A::B::C::F')
78
+
79
+ ::Logging::Logger.new('A::B::C::E::G')
80
+
81
+ assert_same @repo['A::B::C::E'], @repo.parent('A::B::C::E::G')
82
+ end
83
+
84
+ def test_children
85
+ ::Logging::Logger.new('A')
86
+
87
+ assert_equal [], @repo.children('A')
88
+
89
+ ::Logging::Logger.new('A::B')
90
+ a = %w(D E F).map {|name| ::Logging::Logger.new('A::B::C::'+name)}.sort
91
+
92
+ assert_equal [@repo['A::B']], @repo.children('A')
93
+ assert_equal a, @repo.children('A::B')
94
+ assert_equal a, @repo.children('A::B::C')
95
+
96
+ ::Logging::Logger.new('A::B::C')
97
+
98
+ assert_equal [@repo['A::B::C']], @repo.children('A::B')
99
+ assert_equal a, @repo.children('A::B::C')
100
+
101
+ ::Logging::Logger.new('A::B::C::E::G')
102
+
103
+ assert_equal a, @repo.children('A::B::C')
104
+ assert_equal [@repo['A::B::C::E::G']], @repo.children('A::B::C::E')
105
+ end
106
+
107
+ def test_to_key
108
+ assert_equal :root, @repo.to_key(:root)
109
+ assert_equal 'Object', @repo.to_key('Object')
110
+ assert_equal 'Object', @repo.to_key(Object)
111
+ assert_equal 'Object', @repo.to_key(Object.new)
112
+
113
+ assert_equal 'String', @repo.to_key(String)
114
+ assert_equal 'Array', @repo.to_key([])
115
+
116
+ assert_equal 'blah', @repo.to_key('blah')
117
+ assert_equal :blah, @repo.to_key(:blah)
118
+ end
119
+
120
+ end # class TestRepository
121
+ end # module TestLogging
122
+
123
+ # EOF
@@ -0,0 +1,82 @@
1
+ # $Id$
2
+
3
+ require File.join(File.dirname(__FILE__), %w[setup])
4
+
5
+ module TestLogging
6
+
7
+ class TestRootLogger < Test::Unit::TestCase
8
+ include LoggingTestCase
9
+
10
+ def setup
11
+ super
12
+ @root = ::Logging::Logger.root
13
+ end
14
+
15
+ def test_additive
16
+ assert_raise(NoMethodError) {@root.additive}
17
+ end
18
+
19
+ def test_additive_eq
20
+ assert_raise(NoMethodError) {@root.additive = true}
21
+ end
22
+
23
+ def test_level_eq
24
+ assert_equal 0, @root.level
25
+
26
+ assert_raise(ArgumentError) {@root.level = -1}
27
+ assert_raise(ArgumentError) {@root.level = 6}
28
+ assert_raise(ArgumentError) {@root.level = Object}
29
+ assert_raise(ArgumentError) {@root.level = 'bob'}
30
+ assert_raise(ArgumentError) {@root.level = :wtf}
31
+
32
+ @root.level = 'INFO'
33
+ assert_equal 1, @root.level
34
+
35
+ @root.level = :warn
36
+ assert_equal 2, @root.level
37
+
38
+ @root.level = 'error'
39
+ assert_equal 3, @root.level
40
+
41
+ @root.level = 4
42
+ assert_equal 4, @root.level
43
+
44
+ @root.level = :all
45
+ assert_equal 0, @root.level
46
+
47
+ @root.level = 'OFF'
48
+ assert_equal 5, @root.level
49
+
50
+ @root.level = nil
51
+ assert_equal 0, @root.level
52
+ end
53
+
54
+ def test_name
55
+ assert_equal 'root', @root.name
56
+ end
57
+
58
+ def test_parent
59
+ assert_raise(NoMethodError) {@root.parent}
60
+ end
61
+
62
+ def test_parent_eq
63
+ assert_raise(NoMethodError) {@root.parent = nil}
64
+ end
65
+
66
+ def test_spaceship
67
+ logs = %w(
68
+ A A::B A::B::C A::B::C::D A::B::C::E A::B::C::E::G A::B::C::F
69
+ ).map {|x| ::Logging::Logger[x]}
70
+
71
+ logs.each do |log|
72
+ assert_equal(-1, @root <=> log, "'root' <=> '#{log.name}'")
73
+ end
74
+
75
+ assert_equal 0, @root <=> @root
76
+ assert_raise(ArgumentError) {@root <=> 'string'}
77
+ end
78
+
79
+ end # class TestRootLogger
80
+ end # module TestLogging
81
+
82
+ # EOF