logging 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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