logging 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/History.txt +9 -0
  2. data/Manifest.txt +6 -0
  3. data/Rakefile +1 -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/simple_logging.rb +13 -0
  8. data/lib/logging.rb +14 -8
  9. data/lib/logging/appender.rb +36 -6
  10. data/lib/logging/appenders/console.rb +0 -1
  11. data/lib/logging/appenders/email.rb +3 -4
  12. data/lib/logging/appenders/file.rb +0 -1
  13. data/lib/logging/appenders/growl.rb +16 -5
  14. data/lib/logging/appenders/io.rb +0 -1
  15. data/lib/logging/appenders/rolling_file.rb +1 -2
  16. data/lib/logging/appenders/syslog.rb +0 -1
  17. data/lib/logging/config/configurator.rb +182 -0
  18. data/lib/logging/config/yaml_configurator.rb +0 -1
  19. data/lib/logging/layout.rb +0 -1
  20. data/lib/logging/layouts/basic.rb +0 -1
  21. data/lib/logging/layouts/pattern.rb +5 -6
  22. data/lib/logging/log_event.rb +0 -1
  23. data/lib/logging/logger.rb +24 -14
  24. data/lib/logging/repository.rb +13 -3
  25. data/lib/logging/root_logger.rb +0 -1
  26. data/lib/logging/utils.rb +0 -1
  27. data/tasks/ann.rake +0 -1
  28. data/tasks/bones.rake +0 -1
  29. data/tasks/gem.rake +0 -1
  30. data/tasks/git.rake +1 -2
  31. data/tasks/manifest.rake +0 -1
  32. data/tasks/notes.rake +0 -1
  33. data/tasks/post_load.rake +0 -1
  34. data/tasks/rdoc.rake +0 -1
  35. data/tasks/rubyforge.rake +1 -2
  36. data/tasks/setup.rb +0 -1
  37. data/tasks/test.rake +0 -1
  38. data/test/appenders/test_console.rb +0 -1
  39. data/test/appenders/test_email.rb +0 -1
  40. data/test/appenders/test_file.rb +0 -1
  41. data/test/appenders/test_growl.rb +22 -9
  42. data/test/appenders/test_io.rb +30 -3
  43. data/test/appenders/test_rolling_file.rb +0 -1
  44. data/test/appenders/test_syslog.rb +0 -1
  45. data/test/benchmark.rb +0 -1
  46. data/test/config/test_configurator.rb +70 -0
  47. data/test/config/test_yaml_configurator.rb +0 -1
  48. data/test/layouts/test_basic.rb +0 -1
  49. data/test/layouts/test_pattern.rb +0 -1
  50. data/test/setup.rb +0 -1
  51. data/test/test_appender.rb +0 -1
  52. data/test/test_layout.rb +0 -1
  53. data/test/test_log_event.rb +0 -1
  54. data/test/test_logger.rb +2 -2
  55. data/test/test_logging.rb +1 -2
  56. data/test/test_repository.rb +2 -3
  57. data/test/test_root_logger.rb +0 -1
  58. data/test/test_utils.rb +0 -1
  59. metadata +9 -2
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require 'yaml'
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require 'yaml'
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  module Logging
4
3
  module Layouts
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  module Logging
4
3
  module Layouts
@@ -165,7 +164,7 @@ module Layouts
165
164
  end
166
165
  code << "end\n"
167
166
 
168
- pf.meta_eval code
167
+ pf._meta_eval(code, __FILE__, __LINE__)
169
168
  end
170
169
 
171
170
  # call-seq:
@@ -205,7 +204,7 @@ module Layouts
205
204
  code << ")\n"
206
205
  code << "end\n"
207
206
 
208
- pf.meta_eval code
207
+ pf._meta_eval(code, __FILE__, __LINE__)
209
208
  end
210
209
  # :startdoc:
211
210
 
@@ -274,14 +273,14 @@ module Layouts
274
273
  # :stopdoc:
275
274
 
276
275
  # call-seq:
277
- # meta_eval( code )
276
+ # _meta_eval( code )
278
277
  #
279
278
  # Evaluates the given string of _code_ if the singleton class of this
280
279
  # Pattern Layout object.
281
280
  #
282
- def meta_eval( code )
281
+ def _meta_eval( code, file = nil, line = nil )
283
282
  meta = class << self; self end
284
- meta.class_eval code
283
+ meta.class_eval code, file, line
285
284
  end
286
285
  # :startdoc:
287
286
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  module Logging
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require 'thread'
4
3
 
@@ -105,8 +104,9 @@ module Logging
105
104
  CODE
106
105
  end
107
106
 
108
- logger.meta_eval code
107
+ logger._meta_eval(code, __FILE__, __LINE__)
109
108
  end
109
+ logger
110
110
  end
111
111
  # :startdoc:
112
112
 
@@ -143,14 +143,7 @@ module Logging
143
143
  else raise(ArgumentError, "logger name must be a String") end
144
144
 
145
145
  repo = ::Logging::Repository.instance
146
- @name = name
147
- @parent = repo.parent(name)
148
- @appenders = []
149
- @additive = true
150
- @trace = false
151
- @level = nil
152
- ::Logging::Logger.define_log_methods(self)
153
-
146
+ _setup(name, :parent => repo.parent(name))
154
147
  repo.children(name).each {|c| c.parent = self}
155
148
  end
156
149
 
@@ -407,21 +400,38 @@ module Logging
407
400
  ::Logging::Repository.instance.children(name).each do |c|
408
401
  c.define_log_methods
409
402
  end
403
+ self
410
404
  end
411
405
 
412
406
  # :stopdoc:
407
+ public
413
408
 
414
409
  # call-seq:
415
- # meta_eval( code )
410
+ # _meta_eval( code )
416
411
  #
417
412
  # Evaluates the given string of _code_ if the singleton class of this
418
413
  # Logger object.
419
414
  #
420
- def meta_eval( code )
415
+ def _meta_eval( code, file = nil, line = nil )
421
416
  meta = class << self; self end
422
- meta.class_eval code
417
+ meta.class_eval code, file, line
418
+ end
419
+
420
+ # call-seq:
421
+ # _setup( name, opts = {} )
422
+ #
423
+ # Configures internal variables for the logger. This method can be used
424
+ # to avoid storing the logger in the repository.
425
+ #
426
+ def _setup( name, opts = {} )
427
+ @name = name
428
+ @parent = opts.getopt(:parent)
429
+ @appenders = opts.getopt(:appenders, [])
430
+ @additive = opts.getopt(:additive, true)
431
+ @trace = opts.getopt(:trace, false)
432
+ @level = opts.getopt(:level)
433
+ ::Logging::Logger.define_log_methods(self)
423
434
  end
424
- public :meta_eval
425
435
  # :startdoc:
426
436
 
427
437
  end # class Logger
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require 'singleton'
4
3
 
@@ -20,6 +19,15 @@ module Logging
20
19
  #
21
20
  def initialize
22
21
  @h = {:root => ::Logging::RootLogger.new}
22
+
23
+ logger = ::Logging::Logger.allocate
24
+ logger._setup(
25
+ to_key(::Logging),
26
+ :parent => @h[:root],
27
+ :additive => false,
28
+ :level => ::Logging::LEVELS.length # turns this logger off
29
+ )
30
+ @h[logger.name] = logger
23
31
  end
24
32
 
25
33
  # call-seq:
@@ -153,8 +161,10 @@ module Logging
153
161
  #
154
162
  def to_key( key )
155
163
  case key
156
- when Symbol, String; key
157
- when Class; key.name
164
+ when :root, 'root'; :root
165
+ when String; key
166
+ when Symbol; key.to_s
167
+ when Module; key.name
158
168
  when Object; key.class.name
159
169
  end
160
170
  end
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  module Logging
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  class Hash
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  begin
4
3
  require 'bones/smtp_tls'
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  if HAVE_BONES
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require 'rake/gempackagetask'
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  if HAVE_GIT
4
3
 
@@ -34,7 +33,7 @@ namespace :git do
34
33
 
35
34
  end # namespace :git
36
35
 
37
- #task 'gem:release' => 'git:create_tag'
36
+ task 'gem:release' => 'git:create_tag'
38
37
 
39
38
  end # if HAVE_GIT
40
39
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require 'find'
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  if HAVE_BONES
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  # This file does not define any rake tasks. It is used to load some project
4
3
  # settings if they are not defined by the user.
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require 'rake/rdoctask'
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  if PROJ.rubyforge.name.valid? && HAVE_RUBYFORGE
4
3
 
@@ -18,7 +17,7 @@ namespace :gem do
18
17
  end
19
18
 
20
19
  rf = RubyForge.new
21
- rf.configure
20
+ rf.configure rescue nil
22
21
  puts 'Logging in'
23
22
  rf.login
24
23
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require 'rubygems'
4
3
  require 'rake'
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require 'rake/testtask'
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require File.join(File.dirname(__FILE__), %w[.. setup])
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require File.join(File.dirname(__FILE__), %w[.. setup])
4
3
  require 'flexmock'
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require File.join(File.dirname(__FILE__), %w[.. setup])
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require File.join(File.dirname(__FILE__), %w[.. setup])
4
3
  require 'flexmock'
@@ -24,8 +23,7 @@ module TestAppenders
24
23
  end
25
24
 
26
25
  def test_initialize
27
- assert_equal('growlnotify -w -n "growl" -t "%s" -m "%s" -p %d &',
28
- @appender.instance_variable_get(:@growl))
26
+ assert_equal('growlnotify -w -n "growl" -t "%s" -m "%s" -p %d &', @growl)
29
27
  assert_equal(true, @appender.instance_variable_get(:@coalesce))
30
28
  assert_equal("\000", @appender.instance_variable_get(:@title_sep))
31
29
  end
@@ -36,13 +34,13 @@ module TestAppenders
36
34
  warn = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
37
35
  'warning message', false)
38
36
 
39
- flexmock(@appender).should_receive(:system).once.with(
37
+ flexmock(@appender).should_receive(:system => true).once.with(
40
38
  @growl % ['WARN - Test', "warning message\nwarning message\nwarning message", 0])
41
39
 
42
- flexmock(@appender).should_receive(:system).once.with(
40
+ flexmock(@appender).should_receive(:system => true).once.with(
43
41
  @growl % ['INFO - Test', "info message\ninfo message", -1])
44
42
 
45
- flexmock(@appender).should_receive(:system).once.with(
43
+ flexmock(@appender).should_receive(:system => true).once.with(
46
44
  @growl % ['WARN - Test', "warning message", 0])
47
45
 
48
46
  @appender.append warn
@@ -59,7 +57,7 @@ module TestAppenders
59
57
  event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
60
58
  'warning message', false)
61
59
 
62
- flexmock(@appender).should_receive(:system).twice.with(
60
+ flexmock(@appender).should_receive(:system => true).twice.with(
63
61
  @growl % ['WARN - Test', 'warning message', 0])
64
62
 
65
63
  @appender.append event
@@ -67,7 +65,7 @@ module TestAppenders
67
65
  end
68
66
 
69
67
  def test_concat
70
- flexmock(@appender).should_receive(:system).once.with(
68
+ flexmock(@appender).should_receive(:system => true).once.with(
71
69
  @growl % ['', "first message\nsecond message\nthird message", 0])
72
70
 
73
71
  @appender << 'first message'
@@ -79,7 +77,7 @@ module TestAppenders
79
77
  def test_concat_without_coalescing
80
78
  @appender.instance_variable_set(:@coalesce, false)
81
79
 
82
- flexmock(@appender).should_receive(:system).twice.with(
80
+ flexmock(@appender).should_receive(:system => true).twice.with(
83
81
  @growl % ['', 'concat message', 0])
84
82
 
85
83
  @appender << 'concat message'
@@ -108,6 +106,21 @@ module TestAppenders
108
106
  end
109
107
  end
110
108
 
109
+ def test_disabling
110
+ @appender.instance_variable_set(:@coalesce, false)
111
+ event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
112
+ 'warning message', false)
113
+
114
+ flexmock(@appender).should_receive(:system => false).once.with(
115
+ @growl % ['WARN - Test', 'warning message', 0])
116
+
117
+ assert_equal 0, @appender.level
118
+ @appender.append event
119
+ assert_equal 5, @appender.level
120
+ @appender.append event
121
+ @appender.append event
122
+ end
123
+
111
124
  end # class TestGrowl
112
125
  end # module TestLogging
113
126
  end # module TestAppenders
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require File.join(File.dirname(__FILE__), %w[.. setup])
4
3
 
@@ -36,10 +35,24 @@ module TestAppenders
36
35
  end
37
36
 
38
37
  def test_append_error
38
+ # setup an internal logger to capture error messages from the IO
39
+ # appender
40
+ log = StringIO.new
41
+ Logging::Logger[Logging::Appenders::IO].add_appenders(
42
+ Logging::Appenders::IO.new('__internal_io', log)
43
+ )
44
+ Logging::Logger[Logging::Appenders::IO].level = 'all'
45
+
46
+
47
+ # close the string IO object so we get an error
39
48
  @sio.close
40
49
  event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
41
50
  [1, 2, 3, 4], false)
42
- assert_raise(IOError) {@appender.append event}
51
+ @appender.append event
52
+
53
+ log.seek 0
54
+ assert_equal "ERROR Logging::Appenders::IO : <IOError> not opened for writing", log.readline.strip
55
+
43
56
  assert_equal false, @appender.closed?
44
57
  assert_equal 5, @appender.level
45
58
  end
@@ -76,8 +89,22 @@ module TestAppenders
76
89
  end
77
90
 
78
91
  def test_concat_error
92
+ # setup an internal logger to capture error messages from the IO
93
+ # appender
94
+ log = StringIO.new
95
+ Logging::Logger[Logging::Appenders::IO].add_appenders(
96
+ Logging::Appenders::IO.new('__internal_io', log)
97
+ )
98
+ Logging::Logger[Logging::Appenders::IO].level = 'all'
99
+
100
+ # close the string IO object so we get an error
79
101
  @sio.close
80
- assert_raise(IOError) {@appender << 'oopsy'}
102
+ @appender << 'oopsy'
103
+
104
+ log.seek 0
105
+ assert_equal "ERROR Logging::Appenders::IO : <IOError> not opened for writing", log.readline.strip
106
+
107
+ # and the appender does not close itself
81
108
  assert_equal false, @appender.closed?
82
109
  assert_equal 5, @appender.level
83
110
  end
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require File.join(File.dirname(__FILE__), %w[.. setup])
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  require File.join(File.dirname(__FILE__), %w[.. setup])
4
3
 
@@ -1,4 +1,3 @@
1
- # $Id$
2
1
 
3
2
  begin
4
3
  require 'logging'
@@ -0,0 +1,70 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[.. setup])
3
+
4
+ module TestLogging
5
+ module TestConfig
6
+
7
+ class TestConfigurator < Test::Unit::TestCase
8
+ include LoggingTestCase
9
+
10
+ def test_configuration
11
+ begin
12
+ load Logging.path(%w[data logging.rb])
13
+ rescue Exception => err
14
+ flunk err.inspect
15
+ end
16
+
17
+ levels = {
18
+ 'deb' => 0,
19
+ 'inf' => 1,
20
+ 'prt' => 2,
21
+ 'wrn' => 3,
22
+ 'err' => 4,
23
+ 'fat' => 5
24
+ }
25
+ assert_equal levels, Logging::LEVELS
26
+ assert_equal :inspect, Logging::OBJ_FORMAT
27
+
28
+ hash = Logging::Repository.instance.instance_variable_get(:@h)
29
+ assert hash.has_key?('A::B::C')
30
+ assert hash.has_key?('yourlogger')
31
+ end
32
+
33
+ def test_simple_configuration
34
+ begin
35
+ load Logging.path(%w[data simple_logging.rb])
36
+ rescue Exception => err
37
+ flunk err.inspect
38
+ end
39
+
40
+ levels = {
41
+ 'debug' => 0,
42
+ 'info' => 1,
43
+ 'warn' => 2,
44
+ 'error' => 3,
45
+ 'fatal' => 4
46
+ }
47
+ assert_equal levels, Logging::LEVELS
48
+ assert_equal false, Logging.const_defined?('OBJ_FORMAT')
49
+
50
+ root = Logging::Logger.root
51
+ assert_equal 1, root.level
52
+ end
53
+
54
+ def test_bad_appender_configuration
55
+ assert_raise(Logging::Config::Configurator::Error) {
56
+ load Logging.path(%w[data bad_logging_1.rb])
57
+ }
58
+ end
59
+
60
+ def test_bad_layout_configuration
61
+ assert_raise(Logging::Config::Configurator::Error) {
62
+ load Logging.path(%w[data bad_logging_2.rb])
63
+ }
64
+ end
65
+ end
66
+
67
+ end # module TestConfig
68
+ end # module TestLogging
69
+
70
+ # EOF