sgeorgi-logging 1.4.2

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 (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,121 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[.. setup])
3
+
4
+ module TestLogging
5
+ module TestLayouts
6
+
7
+ class TestYaml < Test::Unit::TestCase
8
+ include LoggingTestCase
9
+
10
+ def setup
11
+ super
12
+ @layout = Logging.layouts.yaml({})
13
+ @levels = Logging::LEVELS
14
+ @date_fmt = '\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'
15
+ Thread.current[:name] = nil
16
+ end
17
+
18
+ def test_format
19
+ h = {
20
+ 'level' => 'INFO',
21
+ 'logger' => 'ArrayLogger',
22
+ 'message' => 'log message'
23
+ }
24
+
25
+ event = Logging::LogEvent.new('ArrayLogger', @levels['info'],
26
+ 'log message', false)
27
+ assert_yaml_match h, @layout.format(event)
28
+
29
+ event.data = [1, 2, 3, 4]
30
+ h['message'] = "<Array> #{[1,2,3,4]}"
31
+ assert_yaml_match h, @layout.format(event)
32
+
33
+ event.level = @levels['debug']
34
+ event.data = 'and another message'
35
+ h['level'] = 'DEBUG'
36
+ h['message'] = 'and another message'
37
+ assert_yaml_match h, @layout.format(event)
38
+
39
+ event.logger = 'Test'
40
+ event.level = @levels['fatal']
41
+ event.data = Exception.new
42
+ h['level'] = 'FATAL'
43
+ h['logger'] = 'Test'
44
+ h['message'] = '<Exception> Exception'
45
+ assert_yaml_match h, @layout.format(event)
46
+ end
47
+
48
+ def test_items
49
+ assert_equal %w[timestamp level logger message], @layout.items
50
+ end
51
+
52
+ def test_items_eq
53
+ event = Logging::LogEvent.new('TestLogger', @levels['info'],
54
+ ['log message'], false)
55
+
56
+ @layout.items = %w[timestamp]
57
+ assert_equal %w[timestamp], @layout.items
58
+ assert_match %r/--- \ntimestamp: #@date_fmt\n/, @layout.format(event)
59
+
60
+ # 'foo' is not a recognized item
61
+ assert_raise(ArgumentError) {
62
+ @layout.items = %w[timestamp logger foo]
63
+ }
64
+ end
65
+
66
+ def test_items_all
67
+ event = Logging::LogEvent.new('TestLogger', @levels['info'],
68
+ 'log message', false)
69
+ event.file = 'test_file.rb'
70
+ event.line = 123
71
+ event.method = 'method_name'
72
+
73
+ @layout.items = %w[logger]
74
+ assert_equal %Q[--- \nlogger: TestLogger\n], @layout.format(event)
75
+
76
+ @layout.items = %w[file]
77
+ assert_equal %Q[--- \nfile: test_file.rb\n], @layout.format(event)
78
+
79
+ @layout.items = %w[level]
80
+ assert_equal %Q[--- \nlevel: INFO\n], @layout.format(event)
81
+
82
+ @layout.items = %w[line]
83
+ assert_equal %Q[--- \nline: 123\n], @layout.format(event)
84
+
85
+ @layout.items = %w[message]
86
+ assert_equal %Q[--- \nmessage: log message\n], @layout.format(event)
87
+
88
+ @layout.items = %w[method]
89
+ assert_equal %Q[--- \nmethod: method_name\n], @layout.format(event)
90
+
91
+ @layout.items = %w[pid]
92
+ assert_match %r/\A--- \npid: \d+\n\z/, @layout.format(event)
93
+
94
+ @layout.items = %w[millis]
95
+ assert_match %r/\A--- \nmillis: \d+\n\z/, @layout.format(event)
96
+
97
+ @layout.items = %w[thread_id]
98
+ assert_match %r/\A--- \nthread_id: -?\d+\n\z/, @layout.format(event)
99
+
100
+ @layout.items = %w[thread]
101
+ assert_equal %Q[--- \nthread: \n], @layout.format(event)
102
+ Thread.current[:name] = "Main"
103
+ assert_equal %Q[--- \nthread: Main\n], @layout.format(event)
104
+ end
105
+
106
+ private
107
+
108
+ def assert_yaml_match( expected, actual )
109
+ actual = YAML.load(actual)
110
+
111
+ assert_match %r/#@date_fmt/o, actual['timestamp']
112
+ assert_equal expected['level'], actual['level']
113
+ assert_equal expected['logger'], actual['logger']
114
+ assert_equal expected['message'], actual['message']
115
+ end
116
+
117
+ end # class TestYaml
118
+ end # module TestLayouts
119
+ end # module TestLogging
120
+
121
+ # EOF
data/test/setup.rb ADDED
@@ -0,0 +1,43 @@
1
+
2
+ # Equivalent to a header guard in C/C++
3
+ # Used to prevent the class/module from being loaded more than once
4
+ unless defined? LOGGING_TEST_SETUP
5
+ LOGGING_TEST_SETUP = true
6
+
7
+ require 'rubygems'
8
+ require 'test/unit'
9
+ begin
10
+ require 'turn'
11
+ rescue LoadError; end
12
+
13
+ # This line is needed for Ruby 1.9 -- hashes throw a "KeyError" in 1.9
14
+ # whereas they throw an "IndexError" in 1.8
15
+ #
16
+ KeyError = IndexError if not defined? KeyError
17
+
18
+ require File.join(File.dirname(__FILE__), %w[.. lib logging])
19
+
20
+
21
+ module TestLogging
22
+ module LoggingTestCase
23
+
24
+ TMP = 'tmp'
25
+
26
+ def setup
27
+ super
28
+ Logging.reset
29
+ FileUtils.rm_rf TMP
30
+ FileUtils.mkdir TMP
31
+ end
32
+
33
+ def teardown
34
+ super
35
+ FileUtils.rm_rf TMP
36
+ end
37
+
38
+ end # module LoggingTestCase
39
+ end # module TestLogging
40
+
41
+ end # unless defined?
42
+
43
+ # EOF
@@ -0,0 +1,152 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[setup])
3
+
4
+ module TestLogging
5
+
6
+ class TestAppender < Test::Unit::TestCase
7
+ include LoggingTestCase
8
+
9
+ def setup
10
+ super
11
+
12
+ ::Logging.init
13
+ @levels = ::Logging::LEVELS
14
+ @event = ::Logging::LogEvent.new('logger', @levels['debug'],
15
+ 'message', false)
16
+ @appender = ::Logging::Appender.new 'test_appender'
17
+ end
18
+
19
+ def test_append
20
+ ary = []
21
+ @appender.instance_variable_set :@ary, ary
22
+ def @appender.write( event )
23
+ str = event.instance_of?(::Logging::LogEvent) ?
24
+ @layout.format(event) : event.to_s
25
+ @ary << str
26
+ end
27
+
28
+ assert_nothing_raised {@appender.append @event}
29
+ assert_equal "DEBUG logger : message\n", ary.pop
30
+
31
+ @appender.level = :info
32
+ @appender.append @event
33
+ assert_nil ary.pop
34
+
35
+ @event.level = @levels['info']
36
+ @appender.append @event
37
+ assert_equal " INFO logger : message\n", ary.pop
38
+
39
+ @appender.close
40
+ assert_raise(RuntimeError) {@appender.append @event}
41
+ end
42
+
43
+ def test_close
44
+ assert_equal false, @appender.closed?
45
+
46
+ @appender.close
47
+ assert_equal true, @appender.closed?
48
+ end
49
+
50
+ def test_closed_eh
51
+ assert_equal false, @appender.closed?
52
+
53
+ @appender.close
54
+ assert_equal true, @appender.closed?
55
+ end
56
+
57
+ def test_concat
58
+ ary = []
59
+ @appender.instance_variable_set :@ary, ary
60
+ def @appender.write( event )
61
+ str = event.instance_of?(::Logging::LogEvent) ?
62
+ @layout.format(event) : event.to_s
63
+ @ary << str
64
+ end
65
+
66
+ assert_nothing_raised {@appender << 'log message'}
67
+ assert_equal 'log message', ary.pop
68
+
69
+ @appender.level = :off
70
+ @appender << 'another log message'
71
+ assert_nil ary.pop
72
+
73
+ layout = @appender.layout
74
+ def layout.footer() 'this is the footer' end
75
+
76
+ @appender.close
77
+ assert_raise(RuntimeError) {@appender << 'log message'}
78
+ assert_equal 'this is the footer', ary.pop
79
+ end
80
+
81
+ def test_flush
82
+ assert_same @appender, @appender.flush
83
+ end
84
+
85
+ def test_initialize
86
+ assert_raise(TypeError) {::Logging::Appender.new 'test', :layout => []}
87
+
88
+ layout = ::Logging::Layouts::Basic.new
89
+ @appender = ::Logging::Appender.new 'test', :layout => layout
90
+ assert_same layout, @appender.instance_variable_get(:@layout)
91
+ end
92
+
93
+ def test_layout
94
+ assert_instance_of ::Logging::Layouts::Basic, @appender.layout
95
+ end
96
+
97
+ def test_layout_eq
98
+ layout = ::Logging::Layouts::Basic.new
99
+ assert_not_equal layout, @appender.layout
100
+
101
+ assert_raise(TypeError) {@appender.layout = Object.new}
102
+ assert_raise(TypeError) {@appender.layout = 'not a layout'}
103
+
104
+ @appender.layout = layout
105
+ assert_same layout, @appender.layout
106
+ end
107
+
108
+ def test_level
109
+ assert_equal 0, @appender.level
110
+ end
111
+
112
+ def test_level_eq
113
+ assert_equal 0, @appender.level
114
+
115
+ assert_raise(ArgumentError) {@appender.level = -1}
116
+ assert_raise(ArgumentError) {@appender.level = 6}
117
+ assert_raise(ArgumentError) {@appender.level = Object}
118
+ assert_raise(ArgumentError) {@appender.level = 'bob'}
119
+ assert_raise(ArgumentError) {@appender.level = :wtf}
120
+
121
+ @appender.level = 'INFO'
122
+ assert_equal 1, @appender.level
123
+
124
+ @appender.level = :warn
125
+ assert_equal 2, @appender.level
126
+
127
+ @appender.level = 'error'
128
+ assert_equal 3, @appender.level
129
+
130
+ @appender.level = 4
131
+ assert_equal 4, @appender.level
132
+
133
+ @appender.level = 'off'
134
+ assert_equal 5, @appender.level
135
+
136
+ @appender.level = :all
137
+ assert_equal 0, @appender.level
138
+ end
139
+
140
+ def test_name
141
+ assert_equal 'test_appender', @appender.name
142
+ end
143
+
144
+ def test_inspect
145
+ expected = "<Appender:0x%x name=\"test_appender\">" % @appender.object_id
146
+ assert_equal expected, @appender.inspect
147
+ end
148
+
149
+ end # class TestAppender
150
+ end # module TestLogging
151
+
152
+ # EOF
@@ -0,0 +1,46 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[setup])
3
+
4
+ module TestLogging
5
+
6
+ class TestConsolidate < Test::Unit::TestCase
7
+ include LoggingTestCase
8
+
9
+ def test_root
10
+ Logging.consolidate :root
11
+ root = Logging.logger.root
12
+
13
+ assert_same root, Logging.logger['Foo']
14
+ assert_same root, Logging.logger['Foo::Bar']
15
+ assert_same root, Logging.logger[Array]
16
+ end
17
+
18
+ def test_foo
19
+ Logging.consolidate 'Foo'
20
+ logger = Logging.logger['Foo::Bar::Baz']
21
+
22
+ assert_same Logging.logger['Foo'], logger
23
+ assert_not_same Logging.logger.root, logger
24
+ end
25
+
26
+ def test_many
27
+ Logging.consolidate 'Foo', 'root', 'Foo::Bar::Baz'
28
+
29
+ root = Logging.logger.root
30
+ foo = Logging.logger['Foo']
31
+ fbb = Logging.logger['Foo::Bar::Baz']
32
+
33
+ assert_not_same root, foo
34
+ assert_not_same root, fbb
35
+ assert_not_same foo, fbb
36
+
37
+ assert_same root, Logging.logger[Hash]
38
+ assert_same root, Logging.logger['ActiveRecord::Base']
39
+ assert_same foo, Logging.logger['Foo::Bar']
40
+ assert_same fbb, Logging.logger['Foo::Bar::Baz::Buz']
41
+ end
42
+
43
+ end # class TestConsolidate
44
+ end # module TestLogging
45
+
46
+ # EOF
@@ -0,0 +1,110 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[setup])
3
+
4
+ module TestLogging
5
+
6
+ class TestLayout < Test::Unit::TestCase
7
+ include LoggingTestCase
8
+
9
+ def setup
10
+ super
11
+ @layout = ::Logging::Layout.new
12
+ end
13
+
14
+ def test_header
15
+ assert_equal '', @layout.header
16
+ end
17
+
18
+ def test_initialize
19
+ obj_format = lambda {|l| l.instance_variable_get :@obj_format}
20
+
21
+ assert_equal :string, obj_format[@layout]
22
+
23
+ @layout = ::Logging::Layout.new 'format_as' => 'blah'
24
+ assert_equal :string, obj_format[@layout]
25
+
26
+ @layout = ::Logging::Layout.new :format_as => :inspect
27
+ assert_equal :inspect, obj_format[@layout]
28
+
29
+ @layout = ::Logging::Layout.new 'format_as' => :yaml
30
+ assert_equal :yaml, obj_format[@layout]
31
+
32
+ @layout = ::Logging::Layout.new
33
+ assert_equal :string, obj_format[@layout]
34
+
35
+ ::Logging.format_as :yaml
36
+ @layout = ::Logging::Layout.new
37
+ assert_equal :yaml, obj_format[@layout]
38
+ end
39
+
40
+ def test_footer
41
+ assert_equal '', @layout.footer
42
+ end
43
+
44
+ def test_format
45
+ assert_nil @layout.format(::Logging::LogEvent.new('a','b','c',false))
46
+ end
47
+
48
+ def test_format_obj
49
+ obj = 'test string'
50
+ r = @layout.format_obj obj
51
+ assert_same obj, r
52
+
53
+ obj = RuntimeError.new
54
+ r = @layout.format_obj obj
55
+ assert_equal '<RuntimeError> RuntimeError', r
56
+
57
+ obj = TypeError.new 'only works with Integers'
58
+ r = @layout.format_obj obj
59
+ assert_equal '<TypeError> only works with Integers', r
60
+
61
+ obj = Exception.new 'some exception'
62
+ obj.set_backtrace %w( this is the backtrace )
63
+ r = @layout.format_obj obj
64
+ obj = "<Exception> some exception\n\tthis\n\tis\n\tthe\n\tbacktrace"
65
+ assert_equal obj, r
66
+
67
+ obj = [1, 2, 3, 4]
68
+ r = @layout.format_obj obj
69
+ assert_equal "<Array> #{[1,2,3,4]}", r
70
+
71
+ obj = %w( one two three four )
72
+ @layout = ::Logging::Layout.new :format_as => :inspect
73
+ r = @layout.format_obj obj
74
+ assert_equal '<Array> ["one", "two", "three", "four"]', r
75
+
76
+ @layout = ::Logging::Layout.new :format_as => :yaml
77
+ r = @layout.format_obj obj
78
+ assert_equal "<Array> \n--- \n- one\n- two\n- three\n- four\n", r
79
+
80
+ r = @layout.format_obj Class
81
+ assert_equal "<Class> Class", r
82
+ end
83
+
84
+ def test_format_obj_without_backtrace
85
+ @layout = ::Logging::Layout.new :backtrace => 'off'
86
+
87
+ obj = Exception.new 'some exception'
88
+ obj.set_backtrace %w( this is the backtrace )
89
+ r = @layout.format_obj obj
90
+ obj = "<Exception> some exception"
91
+ assert_equal obj, r
92
+
93
+ ::Logging.backtrace :off
94
+ @layout = ::Logging::Layout.new
95
+
96
+ obj = ArgumentError.new 'wrong type of argument'
97
+ obj.set_backtrace %w( this is the backtrace )
98
+ r = @layout.format_obj obj
99
+ obj = "<ArgumentError> wrong type of argument"
100
+ assert_equal obj, r
101
+ end
102
+
103
+ def test_initializer
104
+ assert_raise(ArgumentError) {::Logging::Layout.new :backtrace => 'foo'}
105
+ end
106
+
107
+ end # class TestLayout
108
+ end # module TestLogging
109
+
110
+ # EOF