logging 0.8.0 → 0.9.0

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 (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