logging 0.3.1 → 0.4.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.
data/README.txt CHANGED
@@ -1,9 +1,13 @@
1
1
  --
2
- $Id: README.txt 12 2007-01-14 20:03:40Z tim_pease $
2
+ $Id: README.txt 35 2007-03-21 19:32:32Z tim_pease $
3
3
  ++
4
4
 
5
5
  = Logging
6
6
 
7
+ A logging framework for Ruby in the spirit of Java's Log4j.
8
+
9
+ Logging provides an easy to use logging system with fine-grained control over log statements, multiple logging destinations, rolling log files, user defined log levels and much more.
10
+
7
11
  obtaining a logger
8
12
  where to log
9
13
  log statements
@@ -1,4 +1,4 @@
1
- # $Id: console.rb 26 2007-01-31 23:19:40Z tim_pease $
1
+ # $Id: console.rb 32 2007-02-22 23:32:17Z tim_pease $
2
2
 
3
3
  require 'logging/appenders/io'
4
4
 
@@ -15,12 +15,11 @@ module Appenders
15
15
  # Stdout.new
16
16
  # Stdout.new( :layout => layout )
17
17
  #
18
- # Creates a new Stdout Appender. The name 'stdout' will always be used for
19
- # this appender.
18
+ # Creates a new Stdout Appender. The name 'stdout' will always be used
19
+ # for this appender.
20
20
  #
21
21
  def initialize( name = nil, opts = {} )
22
22
  name ||= 'stdout'
23
- STDOUT.sync = true
24
23
  super(name, STDOUT, opts)
25
24
  end
26
25
  end # class Stdout
@@ -35,12 +34,11 @@ module Appenders
35
34
  # Stderr.new
36
35
  # Stderr.new( :layout => layout )
37
36
  #
38
- # Creates a new Stderr Appender. The name 'stderr' will always be used for
39
- # this appender.
37
+ # Creates a new Stderr Appender. The name 'stderr' will always be used
38
+ # for this appender.
40
39
  #
41
40
  def initialize( name = nil, opts = {} )
42
41
  name ||= 'stderr'
43
- STDERR.sync = true
44
42
  super(name, STDERR, opts)
45
43
  end
46
44
  end # class Stderr
@@ -1,4 +1,4 @@
1
- # $Id: io.rb 21 2007-01-26 20:23:32Z tim_pease $
1
+ # $Id: io.rb 32 2007-02-22 23:32:17Z tim_pease $
2
2
 
3
3
  require 'logging/appender'
4
4
 
@@ -25,6 +25,7 @@ module Appenders
25
25
  end
26
26
 
27
27
  @io = io
28
+ @io.sync = true
28
29
  super(name, opts)
29
30
  end
30
31
 
@@ -1,4 +1,4 @@
1
- # $Id: rolling_file.rb 29 2007-02-06 19:06:16Z tim_pease $
1
+ # $Id: rolling_file.rb 31 2007-02-22 23:16:17Z tim_pease $
2
2
 
3
3
  require 'logging/appenders/file'
4
4
 
@@ -48,10 +48,11 @@ module Logging::Appenders
48
48
  # layout will be used if none is given.
49
49
  # [:truncate] When set to true any existing log files will be rolled
50
50
  # immediately and a new, empty log file will be created.
51
- # [:max_size] The maximum allowed size (in bytes) of a log file before
51
+ # [:size] The maximum allowed size (in bytes) of a log file before
52
52
  # it is rolled.
53
- # [:max_age] The maximum age (in seconds) of a log file before it is
54
- # rolled.
53
+ # [:age] The maximum age (in seconds) of a log file before it is
54
+ # rolled. The age can also be given as 'daily', 'weekly',
55
+ # or 'monthly'.
55
56
  # [:keep] The number of rolled log files to keep.
56
57
  #
57
58
  def initialize( name, opts = {} )
@@ -74,14 +75,65 @@ module Logging::Appenders
74
75
  roll_files if roll_now
75
76
 
76
77
  # grab out our options
77
- @max_size = opts.delete(:max_size) || opts.delete('max_size')
78
- @max_age = opts.delete(:max_age) || opts.delete('max_age')
78
+ @size = opts.delete(:size) || opts.delete('size')
79
+ @size = Integer(@size) unless @size.nil?
79
80
 
80
- @max_size = Integer(@max_size) unless @max_size.nil?
81
- unless @max_age.nil?
82
- @max_age = Integer(@max_age)
81
+ code = 'def sufficiently_aged?() false end'
82
+
83
+ @age = opts.delete(:age) || opts.delete('age')
84
+ case @age
85
+ when 'daily'
86
+ @start_time = Time.now
87
+ code = <<-CODE
88
+ def sufficiently_aged?
89
+ now = Time.now
90
+ if (now.day != @start_time.day) or (now - @start_time) > 86400
91
+ @start_time = now
92
+ return true
93
+ end
94
+ false
95
+ end
96
+ CODE
97
+ when 'weekly'
98
+ @start_time = Time.now
99
+ code = <<-CODE
100
+ def sufficiently_aged?
101
+ now = Time.now
102
+ if (now - @start_time) > 604800
103
+ @start_time = now
104
+ return true
105
+ end
106
+ false
107
+ end
108
+ CODE
109
+ when 'monthly'
110
+ @start_time = Time.now
111
+ code = <<-CODE
112
+ def sufficiently_aged?
113
+ now = Time.now
114
+ if (now.month != @start_time.month) or (now - @start_time) > 2678400
115
+ @start_time = now
116
+ return true
117
+ end
118
+ false
119
+ end
120
+ CODE
121
+ when Integer, String
122
+ @age = Integer(@age)
83
123
  @start_time = Time.now
124
+ code = <<-CODE
125
+ def sufficiently_aged?
126
+ now = Time.now
127
+ if (now - @start_time) > @age
128
+ @start_time = now
129
+ return true
130
+ end
131
+ false
132
+ end
133
+ CODE
84
134
  end
135
+ meta = class << self; self end
136
+ meta.class_eval code
85
137
 
86
138
  @file_size = (::File.exist?(@fn) ? ::File.size(@fn) : 0)
87
139
  super(name, opts)
@@ -112,7 +164,7 @@ module Logging::Appenders
112
164
  def roll
113
165
  begin; @io.close; rescue; end
114
166
  roll_files
115
- @io = ::File.new(@fn, 'w')
167
+ @io = ::File.new(@fn, 'a')
116
168
  end
117
169
 
118
170
  #
@@ -123,18 +175,13 @@ module Logging::Appenders
123
175
  #
124
176
  def roll_required?
125
177
  # check if max size has been exceeded
126
- if @max_size and @file_size > @max_size
178
+ if @size and @file_size > @size
127
179
  @file_size = 0
128
180
  return true
129
181
  end
130
182
 
131
183
  # check if max age has been exceeded
132
- if @max_age and (Time.now - @start_time) > @max_age
133
- @start_time = Time.now
134
- return true
135
- end
136
-
137
- false
184
+ return sufficiently_aged?
138
185
  end
139
186
 
140
187
  #
@@ -1,4 +1,4 @@
1
- # $Id: layout.rb 17 2007-01-20 18:47:43Z tim_pease $
1
+ # $Id: layout.rb 33 2007-02-28 18:29:09Z tim_pease $
2
2
 
3
3
  require 'yaml'
4
4
  require 'logging'
@@ -88,6 +88,7 @@ module Logging
88
88
  str << "\n\t" << obj.backtrace.join("\n\t")
89
89
  end
90
90
  str
91
+ when nil: "<#{obj.class.name}> nil"
91
92
  else
92
93
  str = "<#{obj.class.name}> "
93
94
  str << case @obj_format
@@ -1,4 +1,4 @@
1
- # $Id: pattern.rb 25 2007-01-30 20:19:12Z tim_pease $
1
+ # $Id: pattern.rb 33 2007-02-28 18:29:09Z tim_pease $
2
2
 
3
3
  require 'logging'
4
4
  require 'logging/layout'
@@ -154,9 +154,20 @@ module Layouts
154
154
  #
155
155
  def self.create_date_format_methods( pf )
156
156
  code = "undef :format_date if method_defined? :format_date\n"
157
- code << "def format_date\nTime.now."
158
- code << if pf.date_method.nil? then "strftime '#{pf.date_pattern}'\n"
159
- else "#{pf.date_method}\n" end
157
+ code << "def format_date\n"
158
+ if pf.date_method.nil?
159
+ if pf.date_pattern =~ %r/%s/
160
+ code << <<-CODE
161
+ now = Time.now
162
+ dp = '#{pf.date_pattern}'.gsub('%s','%06d' % now.usec)
163
+ now.strftime dp
164
+ CODE
165
+ else
166
+ code << "Time.now.strftime '#{pf.date_pattern}'\n"
167
+ end
168
+ else
169
+ code << "Time.now.#{pf.date_method}\n"
170
+ end
160
171
  code << "end\n"
161
172
 
162
173
  pf.meta_eval code
@@ -1,4 +1,4 @@
1
- # $Id: logger.rb 25 2007-01-30 20:19:12Z tim_pease $
1
+ # $Id: logger.rb 33 2007-02-28 18:29:09Z tim_pease $
2
2
 
3
3
  require 'thread'
4
4
  require 'logging'
@@ -107,7 +107,7 @@ module Logging
107
107
  def #{name}?( ) true end
108
108
  def #{name}( data = nil )
109
109
  data = yield if block_given?
110
- log_event(::Logging::LogEvent.new(@name, #{num}, data, @trace)) unless data.nil?
110
+ log_event(::Logging::LogEvent.new(@name, #{num}, data, @trace))
111
111
  true
112
112
  end
113
113
  CODE
@@ -1,4 +1,4 @@
1
- # $Id: repository.rb 13 2007-01-15 17:19:37Z tim_pease $
1
+ # $Id: repository.rb 31 2007-02-22 23:16:17Z tim_pease $
2
2
 
3
3
  require 'singleton'
4
4
  require 'logging/root_logger'
@@ -78,6 +78,20 @@ module Logging
78
78
  #
79
79
  def fetch( key ) @h.fetch(to_key(key)) end
80
80
 
81
+ #
82
+ # call-seq:
83
+ # has_logger?( name )
84
+ #
85
+ # Returns +true+ if the given logger exists in the repository. Returns
86
+ # +false+ if this is not the case.
87
+ #
88
+ # When _name_ is a +String+ or a +Symbol+ it will be used "as is" to
89
+ # retrieve the logger. When _name_ is a +Class+ the class name will be
90
+ # used to retrieve the logger. When _name_ is an object the name of the
91
+ # object's class will be used to retrieve the logger.
92
+ #
93
+ def has_logger?( key ) @h.has_key?(to_key(key)) end
94
+
81
95
  #
82
96
  # call-seq:
83
97
  # parent( key )
data/lib/logging.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: logging.rb 22 2007-01-29 16:20:54Z tim_pease $
1
+ # $Id: logging.rb 35 2007-03-21 19:32:32Z tim_pease $
2
2
 
3
3
  require 'logging/repository'
4
4
 
@@ -42,7 +42,104 @@ module Logging
42
42
 
43
43
  #
44
44
  # call-seq:
45
- # define_levels( levels )
45
+ # Logging.logger( device, age = 7, size = 1048576 )
46
+ # Logging.logger( device, age = 'weekly' )
47
+ #
48
+ # This convenience method returns a Logger instance configured to behave
49
+ # similarly to a core Ruby Logger instance.
50
+ #
51
+ # The _device_ is the logging destination. This can be a filename
52
+ # (String) or an IO object (STDERR, STDOUT, an open File, etc.). The
53
+ # _age_ is the number of old log files to keep or the frequency of
54
+ # rotation (+daily+, +weekly+, or +monthly+). The _size_ is the maximum
55
+ # logfile size and is only used when _age_ is a number.
56
+ #
57
+ # Using the same _device_ twice will result in the same Logger instance
58
+ # being returned. For example, if a Logger is created using STDOUT then
59
+ # the same Logger instance will be returned the next time STDOUT is
60
+ # used. A new Logger instance can be obtained by closing the previous
61
+ # logger instance.
62
+ #
63
+ # log1 = Logging.logger(STDOUT)
64
+ # log2 = Logging.logger(STDOUT)
65
+ # log1.object_id == log2.object_id #=> true
66
+ #
67
+ # log1.close
68
+ # log2 = Logging.logger(STDOUT)
69
+ # log1.object_id == log2.object_id #=> false
70
+ #
71
+ # The format of the log messages can be changed using a few optional
72
+ # parameters. The <tt>:pattern</tt> can be used to change the log
73
+ # message format. The <tt>:date_pattern</tt> can be used to change how
74
+ # timestamps are formatted.
75
+ #
76
+ # log = Logging.logger(STDOUT,
77
+ # :pattern => "[%d] %-5l : %m\n",
78
+ # :date_pattern => "%Y-%m-%d %H:%M:%S.%s")
79
+ #
80
+ # See the documentation for the Logging::Layouts::Pattern class for a
81
+ # full description of the :pattern and :date_pattern formatting strings.
82
+ #
83
+ def logger( *args )
84
+ opts = args.pop if Hash === args.last
85
+ opts ||= Hash.new
86
+
87
+ dev = args.shift
88
+ keep = age = args.shift
89
+ size = args.shift
90
+
91
+ name = case dev
92
+ when String: dev
93
+ when File: dev.path
94
+ else dev.object_id.to_s end
95
+
96
+ repo = ::Logging::Repository.instance
97
+ return repo[name] if repo.has_logger? name
98
+
99
+ l_opts = {
100
+ :pattern => "%.1l, [%d #%p] %#{::Logging::MAX_LEVEL_LENGTH}l : %m\n",
101
+ :date_pattern => '%Y-%m-%dT%H:%M:%S.%s'
102
+ }
103
+ [:pattern, :date_pattern, :date_method].each do |o|
104
+ l_opts[o] = opts.delete(o) if opts.has_key? o
105
+ end
106
+ layout = ::Logging::Layouts::Pattern.new(l_opts)
107
+
108
+ a_opts = Hash.new
109
+ a_opts[:size] = size if Fixnum === size
110
+ a_opts[:age] = age if String === age
111
+ a_opts[:keep] = keep if Fixnum === keep
112
+ a_opts[:filename] = dev if String === dev
113
+ a_opts[:layout] = layout
114
+ a_opts.merge! opts
115
+
116
+ appender =
117
+ case dev
118
+ when String
119
+ ::Logging::Appenders::RollingFile.new(name, a_opts)
120
+ else
121
+ ::Logging::Appenders::IO.new(name, dev, a_opts)
122
+ end
123
+
124
+ logger = ::Logging::Logger.new(name)
125
+ logger.add appender
126
+ logger.additive = false
127
+
128
+ class << logger
129
+ def close
130
+ @appenders.each {|a| a.close}
131
+ h = ::Logging::Repository.instance.instance_variable_get :@h
132
+ h.delete(@name)
133
+ class << self; undef :close; end
134
+ end
135
+ end
136
+
137
+ logger
138
+ end
139
+
140
+ #
141
+ # call-seq:
142
+ # Logging.define_levels( levels )
46
143
  #
47
144
  # Defines the levels available to the loggers. The _levels_ is an array
48
145
  # of strings and symbols. Each element in the array is downcased and
@@ -103,7 +200,7 @@ module Logging
103
200
 
104
201
  #
105
202
  # call-seq:
106
- # format_as( obj_format )
203
+ # Logging.format_as( obj_format )
107
204
  #
108
205
  # Defines the default _obj_format_ method to use when converting objects
109
206
  # into string representations for logging. _obj_format_ can be one of
@@ -1,4 +1,4 @@
1
- # $Id: test_rolling_file.rb 27 2007-02-01 16:58:11Z tim_pease $
1
+ # $Id: test_rolling_file.rb 31 2007-02-22 23:16:17Z tim_pease $
2
2
 
3
3
  require 'test/setup.rb'
4
4
  require 'fileutils'
@@ -93,12 +93,16 @@ module TestAppenders
93
93
  cleanup
94
94
  end
95
95
 
96
- def test_max_age
96
+ def test_age
97
97
  assert_equal [], Dir.glob(@glob)
98
98
 
99
- ap = ::Logging::Appenders::RollingFile.new(NAME,
100
- :filename => @fn, :max_age => 1)
99
+ assert_raise(ArgumentError) do
100
+ ::Logging::Appenders::RollingFile.new(
101
+ NAME, :filename => @fn, :age => 'bob')
102
+ end
101
103
 
104
+ ap = ::Logging::Appenders::RollingFile.new(NAME,
105
+ :filename => @fn, :age => 1)
102
106
  ap << "random message\n"
103
107
  assert_equal 1, Dir.glob(@glob).length
104
108
 
@@ -107,13 +111,50 @@ module TestAppenders
107
111
  assert_equal 2, Dir.glob(@glob).length
108
112
 
109
113
  cleanup
114
+ ap = ::Logging::Appenders::RollingFile.new(NAME,
115
+ :filename => @fn, 'age' => 'daily')
116
+ ap << "random message\n"
117
+ assert_equal 2, Dir.glob(@glob).length
118
+
119
+ t = ap.instance_variable_get :@start_time
120
+ ap.instance_variable_set :@start_time, t - 3600 * 24
121
+
122
+ sleep 0.250
123
+ ap << "yet another random message\n"
124
+ assert_equal 3, Dir.glob(@glob).length
125
+
126
+ cleanup
127
+ ap = ::Logging::Appenders::RollingFile.new(NAME,
128
+ :filename => @fn, :age => 'weekly')
129
+ ap << "random message\n"
130
+ assert_equal 3, Dir.glob(@glob).length
131
+
132
+ t = ap.instance_variable_get :@start_time
133
+ ap.instance_variable_set :@start_time, t - 3600 * 24 * 7
134
+
135
+ sleep 0.250
136
+ ap << "yet another random message\n"
137
+ assert_equal 4, Dir.glob(@glob).length
138
+
139
+ cleanup
140
+ ap = ::Logging::Appenders::RollingFile.new(NAME,
141
+ :filename => @fn, :age => 'monthly')
142
+ ap << "random message\n"
143
+ assert_equal 4, Dir.glob(@glob).length
144
+
145
+ t = ap.instance_variable_get :@start_time
146
+ ap.instance_variable_set :@start_time, t - 3600 * 24 * 31
147
+
148
+ sleep 0.250
149
+ ap << "yet another random message\n"
150
+ assert_equal 5, Dir.glob(@glob).length
110
151
  end
111
152
 
112
- def test_max_size
153
+ def test_size
113
154
  assert_equal [], Dir.glob(@glob)
114
155
 
115
156
  ap = ::Logging::Appenders::RollingFile.new(NAME,
116
- :filename => @fn, :max_size => 100)
157
+ :filename => @fn, :size => 100)
117
158
 
118
159
  ap << 'X' * 100; ap.flush
119
160
  assert_equal 1, Dir.glob(@glob).length
data/test/benchmark.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: benchmark.rb 2 2007-01-09 18:10:50Z tim_pease $
1
+ # $Id: benchmark.rb 34 2007-02-28 21:42:41Z tim_pease $
2
2
 
3
3
  begin
4
4
  require 'logging'
@@ -23,13 +23,12 @@ module Logging
23
23
  class Benchmark
24
24
 
25
25
  def run
26
- this_many = 100_000
26
+ this_many = 300_000
27
27
 
28
28
  sio = StringIO.new
29
29
 
30
- ::Logging::Logger[:root].level = 'warn'
31
- logging = ::Logging::Logger[self]
32
- logging.add ::Logging::Appenders::IO.new('benchmark', sio)
30
+ logging = ::Logging.logger sio
31
+ logging.level = :warn
33
32
 
34
33
  logger = ::Logger.new sio
35
34
  logger.level = ::Logger::WARN
data/test/test_logger.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: test_logger.rb 25 2007-01-30 20:19:12Z tim_pease $
1
+ # $Id: test_logger.rb 33 2007-02-28 18:29:09Z tim_pease $
2
2
 
3
3
  require 'test/setup.rb'
4
4
  require 'stringio'
@@ -313,16 +313,30 @@ module TestLogging
313
313
 
314
314
  assert_equal false, log.debug
315
315
  assert_equal true, log.info
316
+ assert_equal " INFO A Logger : <NilClass> nil\n", a1.readline
317
+ assert_equal " INFO A Logger : <NilClass> nil\n", a2.readline
316
318
  assert_equal true, log.warn
319
+ assert_equal " WARN A Logger : <NilClass> nil\n", a1.readline
320
+ assert_equal " WARN A Logger : <NilClass> nil\n", a2.readline
317
321
  assert_equal true, log.error
322
+ assert_equal "ERROR A Logger : <NilClass> nil\n", a1.readline
323
+ assert_equal "ERROR A Logger : <NilClass> nil\n", a2.readline
318
324
  assert_equal true, log.fatal
325
+ assert_equal "FATAL A Logger : <NilClass> nil\n", a1.readline
326
+ assert_equal "FATAL A Logger : <NilClass> nil\n", a2.readline
319
327
 
320
328
  log.level = :warn
321
329
  assert_equal false, log.debug
322
330
  assert_equal false, log.info
323
331
  assert_equal true, log.warn
332
+ assert_equal " WARN A Logger : <NilClass> nil\n", a1.readline
333
+ assert_equal " WARN A Logger : <NilClass> nil\n", a2.readline
324
334
  assert_equal true, log.error
335
+ assert_equal "ERROR A Logger : <NilClass> nil\n", a1.readline
336
+ assert_equal "ERROR A Logger : <NilClass> nil\n", a2.readline
325
337
  assert_equal true, log.fatal
338
+ assert_equal "FATAL A Logger : <NilClass> nil\n", a1.readline
339
+ assert_equal "FATAL A Logger : <NilClass> nil\n", a2.readline
326
340
 
327
341
  assert_raise(NoMethodError) {log.critical 'this log level does not exist'}
328
342
 
data/test/test_logging.rb CHANGED
@@ -1,16 +1,30 @@
1
- # $Id: test_logging.rb 22 2007-01-29 16:20:54Z tim_pease $
1
+ # $Id: test_logging.rb 34 2007-02-28 21:42:41Z tim_pease $
2
2
 
3
3
  require 'test/setup.rb'
4
+ require 'fileutils'
4
5
 
5
6
  module TestLogging
6
7
 
7
8
  class TestLogging < Test::Unit::TestCase
8
9
  include LoggingTestCase
9
10
 
11
+ TMP = 'tmp'
12
+
10
13
  def setup
11
14
  super
12
15
  @levels = ::Logging::LEVELS
13
16
  @lnames = ::Logging::LNAMES
17
+
18
+ FileUtils.rm_rf TMP
19
+ FileUtils.mkdir(TMP)
20
+ @fn = File.join(TMP, 'test.log')
21
+ @glob = File.join(TMP, '*.log')
22
+ end
23
+
24
+ def teardown
25
+ h = ::Logging::Repository.instance.instance_variable_get :@h
26
+ h.values.each {|l| l.close if l.respond_to? :close}
27
+ FileUtils.rm_rf TMP
14
28
  end
15
29
 
16
30
  def test_configure
@@ -78,6 +92,46 @@ module TestLogging
78
92
  File.delete('temp.log') if File.exist?('temp.log')
79
93
  end
80
94
 
95
+ def test_logger
96
+ assert_raise(TypeError) {::Logging.logger []}
97
+
98
+ logger = ::Logging.logger STDOUT
99
+ assert_match %r/\A-?\d+\z/, logger.name
100
+ assert_same logger, ::Logging.logger(STDOUT)
101
+
102
+ logger.close
103
+ assert !STDOUT.closed?
104
+
105
+ assert !File.exist?(@fn)
106
+ fd = File.new @fn, 'w'
107
+ logger = ::Logging.logger fd, 2, 100
108
+ assert_equal @fn, logger.name
109
+ logger.debug 'this is a debug message'
110
+ logger.warn 'this is a warning message'
111
+ logger.error 'and now we should have over 100 bytes of data ' +
112
+ 'in the log file'
113
+ logger.info 'but the log file should not roll since we provided ' +
114
+ 'a file descriptor -- not a file name'
115
+ logger.close
116
+ assert fd.closed?
117
+ assert File.exist?(@fn)
118
+ assert_equal 1, Dir.glob(@glob).length
119
+
120
+ FileUtils.rm_f @fn
121
+ assert !File.exist?(@fn)
122
+ logger = ::Logging.logger @fn, 2, 100
123
+ assert File.exist?(@fn)
124
+ assert_equal @fn, logger.name
125
+ logger.debug 'this is a debug message'
126
+ logger.warn 'this is a warning message'
127
+ logger.error 'and now we should have over 100 bytes of data ' +
128
+ 'in the log file'
129
+ logger.info 'but the log file should not roll since we provided ' +
130
+ 'a file descriptor -- not a file name'
131
+ logger.close
132
+ assert_equal 3, Dir.glob(@glob).length
133
+ end
134
+
81
135
  def test_define_levels_default
82
136
  empty = {}
83
137
  assert_equal empty, @levels
@@ -1,4 +1,4 @@
1
- # $Id: test_repository.rb 13 2007-01-15 17:19:37Z tim_pease $
1
+ # $Id: test_repository.rb 31 2007-02-22 23:16:17Z tim_pease $
2
2
 
3
3
  require 'test/setup.rb'
4
4
 
@@ -47,6 +47,18 @@ module TestLogging
47
47
  assert_same @repo[:root], @repo.fetch(:root)
48
48
  end
49
49
 
50
+ def test_fetch
51
+ assert @repo.has_logger?(:root)
52
+ assert !@repo.has_logger?('A')
53
+
54
+ %w(A A::B A::B::C::D A::B::C::E A::B::C::F).each do |name|
55
+ ::Logging::Logger.new(name)
56
+ end
57
+
58
+ assert @repo.has_logger?('A')
59
+ assert @repo.has_logger?('A::B')
60
+ end
61
+
50
62
  def test_parent
51
63
  %w(A A::B A::B::C::D A::B::C::E A::B::C::F).each do |name|
52
64
  ::Logging::Logger.new(name)
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.1
3
3
  specification_version: 1
4
4
  name: logging
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.3.1
7
- date: 2007-02-08 00:00:00 -07:00
6
+ version: 0.4.0
7
+ date: 2007-03-21 00:00:00 -06:00
8
8
  summary: A flexible and extendable logging library for Ruby.
9
9
  require_paths:
10
10
  - lib