sgeorgi-logging 1.4.2

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