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 +5 -1
- data/lib/logging/appenders/console.rb +5 -7
- data/lib/logging/appenders/io.rb +2 -1
- data/lib/logging/appenders/rolling_file.rb +64 -17
- data/lib/logging/layout.rb +2 -1
- data/lib/logging/layouts/pattern.rb +15 -4
- data/lib/logging/logger.rb +2 -2
- data/lib/logging/repository.rb +15 -1
- data/lib/logging.rb +100 -3
- data/test/appenders/test_rolling_file.rb +47 -6
- data/test/benchmark.rb +4 -5
- data/test/test_logger.rb +15 -1
- data/test/test_logging.rb +55 -1
- data/test/test_repository.rb +13 -1
- metadata +2 -2
data/README.txt
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
--
|
2
|
-
$Id: README.txt
|
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
|
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
|
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
|
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
|
data/lib/logging/appenders/io.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: rolling_file.rb
|
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
|
-
# [:
|
51
|
+
# [:size] The maximum allowed size (in bytes) of a log file before
|
52
52
|
# it is rolled.
|
53
|
-
# [:
|
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
|
-
@
|
78
|
-
@
|
78
|
+
@size = opts.delete(:size) || opts.delete('size')
|
79
|
+
@size = Integer(@size) unless @size.nil?
|
79
80
|
|
80
|
-
|
81
|
-
|
82
|
-
|
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, '
|
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 @
|
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
|
-
|
133
|
-
@start_time = Time.now
|
134
|
-
return true
|
135
|
-
end
|
136
|
-
|
137
|
-
false
|
184
|
+
return sufficiently_aged?
|
138
185
|
end
|
139
186
|
|
140
187
|
#
|
data/lib/logging/layout.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: layout.rb
|
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
|
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\
|
158
|
-
|
159
|
-
|
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
|
data/lib/logging/logger.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: logger.rb
|
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))
|
110
|
+
log_event(::Logging::LogEvent.new(@name, #{num}, data, @trace))
|
111
111
|
true
|
112
112
|
end
|
113
113
|
CODE
|
data/lib/logging/repository.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: repository.rb
|
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
|
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
|
-
#
|
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
|
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
|
96
|
+
def test_age
|
97
97
|
assert_equal [], Dir.glob(@glob)
|
98
98
|
|
99
|
-
|
100
|
-
|
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
|
153
|
+
def test_size
|
113
154
|
assert_equal [], Dir.glob(@glob)
|
114
155
|
|
115
156
|
ap = ::Logging::Appenders::RollingFile.new(NAME,
|
116
|
-
:filename => @fn, :
|
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
|
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 =
|
26
|
+
this_many = 300_000
|
27
27
|
|
28
28
|
sio = StringIO.new
|
29
29
|
|
30
|
-
::Logging
|
31
|
-
logging =
|
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
|
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
|
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
|
data/test/test_repository.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: test_repository.rb
|
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.
|
7
|
-
date: 2007-
|
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
|