logging 1.0.0 → 1.1.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/History.txt +8 -0
- data/README.rdoc +1 -0
- data/examples/consolidation.rb +81 -0
- data/lib/logging.rb +62 -1
- data/lib/logging/layouts/pattern.rb +36 -18
- data/lib/logging/logger.rb +16 -3
- data/lib/logging/repository.rb +41 -3
- data/test/layouts/test_pattern.rb +21 -0
- data/test/test_consolidate.rb +46 -0
- data/test/test_logger.rb +0 -4
- data/test/test_repository.rb +32 -0
- metadata +5 -2
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 1.1.0 / 2009-04-21
|
2
|
+
|
3
|
+
3 minor enhancements
|
4
|
+
- Added a "global" logger method
|
5
|
+
- Loggers can be consolidated on a per-namespace basis
|
6
|
+
- Added a precision to the logger name specifier in the pattern layout
|
7
|
+
[addresses http://github.com/TwP/logging/issues#issue/1]
|
8
|
+
|
1
9
|
== 1.0.0 / 2009-04-17
|
2
10
|
|
3
11
|
2 major enhancements
|
data/README.rdoc
CHANGED
@@ -0,0 +1,81 @@
|
|
1
|
+
#
|
2
|
+
# Logging support can be included globally giving all objects in the Ruby
|
3
|
+
# space access to a logger instance. This "logger" method invokes
|
4
|
+
#
|
5
|
+
# Logging.logger[self]
|
6
|
+
#
|
7
|
+
# And returns the appropriate logger for the current context.
|
8
|
+
#
|
9
|
+
# However, there might be times when it is not desirable to create an
|
10
|
+
# individual logger for every class and module. This is where the concept of
|
11
|
+
# "logger consolidation" comes into play. A ruby namespace can be configured
|
12
|
+
# to consolidate loggers such that all classes and modules in that namespace
|
13
|
+
# use the same logger instance.
|
14
|
+
#
|
15
|
+
# Because our loggers are being accessed via the self context, it becomes
|
16
|
+
# very easy to turn on debugging on a class-by-class basis (or a
|
17
|
+
# module-by-module basis). The trick is to create the debug logger first and
|
18
|
+
# then configure the namespace to consolidate all loggers. Since we already
|
19
|
+
# created our debug logger, it will be used by the class in question instead
|
20
|
+
# of the consolidated namespace logger.
|
21
|
+
#
|
22
|
+
|
23
|
+
require 'logging'
|
24
|
+
include Logging.globally
|
25
|
+
|
26
|
+
Logging.logger.root.appenders = Logging.appenders.stdout
|
27
|
+
Logging.logger.root.level = :info
|
28
|
+
|
29
|
+
# we want to debug the "FooBar" module of ActiveRecord
|
30
|
+
Logging.logger['ActiveRecord::FooBar'].level = :debug
|
31
|
+
|
32
|
+
# and we want everything else in ActiveRecord and ActiveResource
|
33
|
+
# to use the same consolidated loggers (one for each namespace)
|
34
|
+
Logging.consolidate 'ActiveRecord', 'ActiveResource'
|
35
|
+
|
36
|
+
|
37
|
+
logger.info 'because we included Logging globally, ' \
|
38
|
+
'we have access to a logger anywhere in our code'
|
39
|
+
|
40
|
+
|
41
|
+
module ActiveRecord
|
42
|
+
logger.info 'even at the module level'
|
43
|
+
|
44
|
+
class Base
|
45
|
+
logger.info 'and at the class level'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
module ActiveResource
|
51
|
+
logger.info "you'll notice that these log messages " \
|
52
|
+
"are coming from the same logger"
|
53
|
+
|
54
|
+
class Base
|
55
|
+
logger.info "even though the logger is invoked from different classes"
|
56
|
+
end
|
57
|
+
|
58
|
+
class Foo
|
59
|
+
def foo
|
60
|
+
logger.info "that is because ActiveRecord and ActiveResource " \
|
61
|
+
"are consolidating loggers in their respective namespaces"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
Foo.new.foo
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
module ActiveRecord
|
69
|
+
logger.debug 'this debug message will not be logged ' \
|
70
|
+
'- level is info'
|
71
|
+
|
72
|
+
class Base
|
73
|
+
logger.debug 'and this debug message will not be logged either ' \
|
74
|
+
'- same logger as above'
|
75
|
+
end
|
76
|
+
|
77
|
+
module FooBar
|
78
|
+
logger.debug 'however, this debug message WILL be logged'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
data/lib/logging.rb
CHANGED
@@ -30,7 +30,7 @@ begin require 'fastthread'; rescue LoadError; end
|
|
30
30
|
module Logging
|
31
31
|
|
32
32
|
# :stopdoc:
|
33
|
-
VERSION = '1.
|
33
|
+
VERSION = '1.1.0'
|
34
34
|
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
35
35
|
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
36
36
|
WIN32 = %r/djgpp|(cyg|ms|bcc)win|mingw/ =~ RUBY_PLATFORM
|
@@ -172,6 +172,67 @@ module Logging
|
|
172
172
|
::Logging::Appenders
|
173
173
|
end
|
174
174
|
|
175
|
+
# call-seq:
|
176
|
+
# Logging.consolidate( 'First::Name', 'Second::Name', ... )
|
177
|
+
#
|
178
|
+
# Consolidate all loggers under the given namespace. All child loggers
|
179
|
+
# in the namespace will use the "consolidated" namespace logger instead
|
180
|
+
# of creating a new logger for each class or module.
|
181
|
+
#
|
182
|
+
# If the "root" logger name is passed to this method then all loggers
|
183
|
+
# will consolidate to the root logger. In other words, only the root
|
184
|
+
# logger will be created, and it will be used by all classes and moduels
|
185
|
+
# in the applicaiton.
|
186
|
+
#
|
187
|
+
# ==== Example
|
188
|
+
#
|
189
|
+
# Logging.consolidate( 'Foo' )
|
190
|
+
#
|
191
|
+
# foo = Logging.logger['Foo']
|
192
|
+
# bar = Logging.logger['Foo::Bar']
|
193
|
+
# baz = Logging.logger['Baz']
|
194
|
+
#
|
195
|
+
# foo.object_id == bar.object_id #=> true
|
196
|
+
# foo.object_id == baz.object_id #=> false
|
197
|
+
#
|
198
|
+
def consolidate( *args )
|
199
|
+
::Logging::Repository.instance.add_master(*args)
|
200
|
+
end
|
201
|
+
|
202
|
+
# call-seq:
|
203
|
+
# include Logging.globally
|
204
|
+
# include Logging.globally( :logger )
|
205
|
+
#
|
206
|
+
# Add a "logger" method to the including context. If included from
|
207
|
+
# Object or Kernel, the logger method will be available to all objects.
|
208
|
+
#
|
209
|
+
# Optionally, a method name can be given and that will be used to
|
210
|
+
# provided access to the logger:
|
211
|
+
#
|
212
|
+
# include Logging.globally( :log )
|
213
|
+
# log.info "Just using a shorter method name"
|
214
|
+
#
|
215
|
+
# If you prefer to use the shorter "log" to access the logger.
|
216
|
+
#
|
217
|
+
# ==== Example
|
218
|
+
#
|
219
|
+
# include Logging.globally
|
220
|
+
#
|
221
|
+
# class Foo
|
222
|
+
# logger.debug "Loading the Foo class"
|
223
|
+
# def initialize
|
224
|
+
# logger.info "Creating some new foo"
|
225
|
+
# end
|
226
|
+
# end
|
227
|
+
#
|
228
|
+
# logger.fatal "End of example"
|
229
|
+
#
|
230
|
+
def globally( name = :logger )
|
231
|
+
Module.new {
|
232
|
+
eval "def #{name}() @_logging_logger ||= ::Logging::Logger[self] end"
|
233
|
+
}
|
234
|
+
end
|
235
|
+
|
175
236
|
# call-seq:
|
176
237
|
# Logging.init( levels )
|
177
238
|
#
|
@@ -38,7 +38,7 @@ module Logging::Layouts
|
|
38
38
|
# conversion characters are
|
39
39
|
#
|
40
40
|
# [c] Used to output the name of the logger that generated the log
|
41
|
-
# event.
|
41
|
+
# event. Supports an optional "precision" described further below.
|
42
42
|
# [d] Used to output the date of the log event. The format of the
|
43
43
|
# date is specified using the :date_pattern option when the Layout
|
44
44
|
# is created. ISO8601 format is assumed if not date pattern is given.
|
@@ -61,6 +61,11 @@ module Logging::Layouts
|
|
61
61
|
# more human readable output for multithread application logs.
|
62
62
|
# [%] The sequence '%%' outputs a single percent sign.
|
63
63
|
#
|
64
|
+
# The logger name directive 'c' accepts an optional precision that will
|
65
|
+
# only print the rightmost number of namespace identifiers for the logger.
|
66
|
+
# By default the logger name is printed in full. For example, for the
|
67
|
+
# logger name "Foo::Bar::Baz" the pattern %c{2} will output "Bar::Baz".
|
68
|
+
#
|
64
69
|
# The directives F, L, and M will only work if the Logger generating the
|
65
70
|
# events is configured to generate tracing information. If this is not
|
66
71
|
# the case these fields will always be empty.
|
@@ -118,30 +123,31 @@ module Logging::Layouts
|
|
118
123
|
|
119
124
|
# Arguments to sprintf keyed to directive letters
|
120
125
|
DIRECTIVE_TABLE = {
|
121
|
-
'c' => 'event.logger',
|
122
|
-
'd' => 'format_date',
|
123
|
-
'F' => 'event.file',
|
124
|
-
'l' => '::Logging::LNAMES[event.level]',
|
125
|
-
'L' => 'event.line',
|
126
|
-
'm' => 'format_obj(event.data)',
|
127
|
-
'M' => 'event.method',
|
128
|
-
'p' => 'Process.pid',
|
129
|
-
'r' => 'Integer((Time.now-@created_at)*1000).to_s',
|
130
|
-
't' => 'Thread.current.object_id.to_s',
|
131
|
-
'T' => 'Thread.current[:name]',
|
126
|
+
'c' => 'event.logger'.freeze,
|
127
|
+
'd' => 'format_date'.freeze,
|
128
|
+
'F' => 'event.file'.freeze,
|
129
|
+
'l' => '::Logging::LNAMES[event.level]'.freeze,
|
130
|
+
'L' => 'event.line'.freeze,
|
131
|
+
'm' => 'format_obj(event.data)'.freeze,
|
132
|
+
'M' => 'event.method'.freeze,
|
133
|
+
'p' => 'Process.pid'.freeze,
|
134
|
+
'r' => 'Integer((Time.now-@created_at)*1000).to_s'.freeze,
|
135
|
+
't' => 'Thread.current.object_id.to_s'.freeze,
|
136
|
+
'T' => 'Thread.current[:name]'.freeze,
|
132
137
|
'%' => :placeholder
|
133
|
-
}
|
138
|
+
}.freeze
|
134
139
|
|
135
140
|
# Matches the first directive encountered and the stuff around it.
|
136
141
|
#
|
137
142
|
# * $1 is the stuff before directive or "" if not applicable
|
138
143
|
# * $2 is the %#.# match within directive group
|
139
144
|
# * $3 is the directive letter
|
140
|
-
# * $4 is the
|
141
|
-
|
145
|
+
# * $4 is the precision specifier for the logger name
|
146
|
+
# * $5 is the stuff after the directive or "" if not applicable
|
147
|
+
DIRECTIVE_RGXP = %r/([^%]*)(?:(%-?\d*(?:\.\d+)?)([a-zA-Z%])(?:\{(\d+)\})?)?(.*)/m
|
142
148
|
|
143
149
|
# default date format
|
144
|
-
ISO8601 = "%Y-%m-%d %H:%M:%S"
|
150
|
+
ISO8601 = "%Y-%m-%d %H:%M:%S".freeze
|
145
151
|
|
146
152
|
# call-seq:
|
147
153
|
# Pattern.create_date_format_methods( pf )
|
@@ -167,6 +173,7 @@ module Logging::Layouts
|
|
167
173
|
code << "Time.now.#{pf.date_method}\n"
|
168
174
|
end
|
169
175
|
code << "end\n"
|
176
|
+
::Logging.log_internal(0) {code}
|
170
177
|
|
171
178
|
pf._meta_eval(code, __FILE__, __LINE__)
|
172
179
|
end
|
@@ -191,22 +198,33 @@ module Logging::Layouts
|
|
191
198
|
|
192
199
|
case m[3]
|
193
200
|
when '%'; code << '%%'
|
201
|
+
when 'c'
|
202
|
+
code << m[2] + 's'
|
203
|
+
args << DIRECTIVE_TABLE[m[3]].dup
|
204
|
+
if m[4]
|
205
|
+
raise ArgumentError, "logger name precision must be an integer greater than zero: #{m[4]}" unless Integer(m[4]) > 0
|
206
|
+
args.last <<
|
207
|
+
".split(::Logging::Repository::PATH_DELIMITER)" \
|
208
|
+
".last(#{m[4]}).join(::Logging::Repository::PATH_DELIMITER)"
|
209
|
+
end
|
194
210
|
when *DIRECTIVE_TABLE.keys
|
195
211
|
code << m[2] + 's'
|
212
|
+
code << "{#{m[4]}}" if m[4]
|
196
213
|
args << DIRECTIVE_TABLE[m[3]]
|
197
214
|
when nil; break
|
198
215
|
else
|
199
216
|
raise ArgumentError, "illegal format character - '#{m[3]}'"
|
200
217
|
end
|
201
218
|
|
202
|
-
break if m[
|
203
|
-
pattern = m[
|
219
|
+
break if m[5].empty?
|
220
|
+
pattern = m[5]
|
204
221
|
end
|
205
222
|
|
206
223
|
code << '"'
|
207
224
|
code << ', ' + args.join(', ') unless args.empty?
|
208
225
|
code << ")\n"
|
209
226
|
code << "end\n"
|
227
|
+
::Logging.log_internal(0) {code}
|
210
228
|
|
211
229
|
pf._meta_eval(code, __FILE__, __LINE__)
|
212
230
|
end
|
data/lib/logging/logger.rb
CHANGED
@@ -51,9 +51,22 @@ module Logging
|
|
51
51
|
@mutex.synchronize do
|
52
52
|
logger = repo[name]
|
53
53
|
if logger.nil?
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
|
55
|
+
master = repo.master_for(name)
|
56
|
+
if master
|
57
|
+
if repo.has_logger?(master)
|
58
|
+
logger = repo[master]
|
59
|
+
else
|
60
|
+
logger = super(master)
|
61
|
+
repo[master] = logger
|
62
|
+
repo.children(master).each {|c| c.__send__(:parent=, logger)}
|
63
|
+
end
|
64
|
+
repo[name] = logger
|
65
|
+
else
|
66
|
+
logger = super(name)
|
67
|
+
repo[name] = logger
|
68
|
+
repo.children(name).each {|c| c.__send__(:parent=, logger)}
|
69
|
+
end
|
57
70
|
end
|
58
71
|
logger
|
59
72
|
end
|
data/lib/logging/repository.rb
CHANGED
@@ -18,6 +18,7 @@ module Logging
|
|
18
18
|
# +Repository+ instance.
|
19
19
|
#
|
20
20
|
def initialize
|
21
|
+
@masters = []
|
21
22
|
@h = {:root => ::Logging::RootLogger.new}
|
22
23
|
|
23
24
|
# configures the internal logger which is disabled by default
|
@@ -107,7 +108,7 @@ module Logging
|
|
107
108
|
# of B is A. Parents are determined by namespace.
|
108
109
|
#
|
109
110
|
def parent( key )
|
110
|
-
name =
|
111
|
+
name = parent_name(to_key(key))
|
111
112
|
return if name.nil?
|
112
113
|
@h[name]
|
113
114
|
end
|
@@ -126,7 +127,7 @@ module Logging
|
|
126
127
|
|
127
128
|
@h.each_pair do |child,logger|
|
128
129
|
next if :root == child
|
129
|
-
ary << logger if parent ==
|
130
|
+
ary << logger if parent == parent_name(child)
|
130
131
|
end
|
131
132
|
return ary.sort
|
132
133
|
end
|
@@ -154,7 +155,7 @@ module Logging
|
|
154
155
|
# Returns the name of the parent for the logger identified by the given
|
155
156
|
# _key_. If the _key_ is for the root logger, then +nil+ is returned.
|
156
157
|
#
|
157
|
-
def
|
158
|
+
def parent_name( key )
|
158
159
|
return if :root == key
|
159
160
|
|
160
161
|
a = key.split PATH_DELIMITER
|
@@ -166,6 +167,43 @@ module Logging
|
|
166
167
|
p
|
167
168
|
end
|
168
169
|
|
170
|
+
# call-seq:
|
171
|
+
# add_master( 'First::Name', 'Second::Name', ... )
|
172
|
+
#
|
173
|
+
# Add the given logger names to the list of consolidation masters. All
|
174
|
+
# classes in the given namespace(s) will use these loggers instead of
|
175
|
+
# creating their own individual loggers.
|
176
|
+
#
|
177
|
+
def add_master( *args )
|
178
|
+
args.map do |key|
|
179
|
+
key = to_key(key)
|
180
|
+
@masters << key unless @masters.include? key
|
181
|
+
key
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
# call-seq:
|
186
|
+
# master_for( key )
|
187
|
+
#
|
188
|
+
# Retruns the consolidation master name for the given _key_. If there is
|
189
|
+
# no consolidation master, then +nil+ is returned.
|
190
|
+
#
|
191
|
+
def master_for( key )
|
192
|
+
return if @masters.empty?
|
193
|
+
key = to_key(key)
|
194
|
+
|
195
|
+
loop do
|
196
|
+
break key if @masters.include? key
|
197
|
+
break nil if :root == key
|
198
|
+
|
199
|
+
if index = key.rindex(PATH_DELIMITER)
|
200
|
+
key = key.slice(0, index)
|
201
|
+
else
|
202
|
+
key = :root
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
169
207
|
end # class Repository
|
170
208
|
end # module Logging
|
171
209
|
|
@@ -170,6 +170,27 @@ module TestLayouts
|
|
170
170
|
assert_equal 'tim ', @layout.format(event)
|
171
171
|
end
|
172
172
|
|
173
|
+
def test_pattern_logger_name_precision
|
174
|
+
event = Logging::LogEvent.new('Foo', @levels['info'], 'message', false)
|
175
|
+
|
176
|
+
@layout.pattern = '%c{2}'
|
177
|
+
assert_equal 'Foo', @layout.format(event)
|
178
|
+
|
179
|
+
event.logger = 'Foo::Bar::Baz::Buz'
|
180
|
+
assert_equal 'Baz::Buz', @layout.format(event)
|
181
|
+
|
182
|
+
assert_raise(ArgumentError) {
|
183
|
+
@layout.pattern = '%c{0}'
|
184
|
+
}
|
185
|
+
|
186
|
+
@layout.pattern = '%c{foo}'
|
187
|
+
event.logger = 'Foo::Bar'
|
188
|
+
assert_equal 'Foo::Bar{foo}', @layout.format(event)
|
189
|
+
|
190
|
+
@layout.pattern = '%m{42}'
|
191
|
+
assert_equal 'message{42}', @layout.format(event)
|
192
|
+
end
|
193
|
+
|
173
194
|
end # class TestBasic
|
174
195
|
end # module TestLayouts
|
175
196
|
end # module TestLogging
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
require File.join(File.dirname(__FILE__), %w[setup])
|
3
|
+
|
4
|
+
module TestLogging
|
5
|
+
|
6
|
+
class TestConsolidate < Test::Unit::TestCase
|
7
|
+
include LoggingTestCase
|
8
|
+
|
9
|
+
def test_root
|
10
|
+
Logging.consolidate :root
|
11
|
+
root = Logging.logger.root
|
12
|
+
|
13
|
+
assert_same root, Logging.logger['Foo']
|
14
|
+
assert_same root, Logging.logger['Foo::Bar']
|
15
|
+
assert_same root, Logging.logger[Array]
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_foo
|
19
|
+
Logging.consolidate 'Foo'
|
20
|
+
logger = Logging.logger['Foo::Bar::Baz']
|
21
|
+
|
22
|
+
assert_same Logging.logger['Foo'], logger
|
23
|
+
assert_not_same Logging.logger.root, logger
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_many
|
27
|
+
Logging.consolidate 'Foo', 'root', 'Foo::Bar::Baz'
|
28
|
+
|
29
|
+
root = Logging.logger.root
|
30
|
+
foo = Logging.logger['Foo']
|
31
|
+
fbb = Logging.logger['Foo::Bar::Baz']
|
32
|
+
|
33
|
+
assert_not_same root, foo
|
34
|
+
assert_not_same root, fbb
|
35
|
+
assert_not_same foo, fbb
|
36
|
+
|
37
|
+
assert_same root, Logging.logger[Hash]
|
38
|
+
assert_same root, Logging.logger['ActiveRecord::Base']
|
39
|
+
assert_same foo, Logging.logger['Foo::Bar']
|
40
|
+
assert_same fbb, Logging.logger['Foo::Bar::Baz::Buz']
|
41
|
+
end
|
42
|
+
|
43
|
+
end # class TestConsolidate
|
44
|
+
end # module TestLogging
|
45
|
+
|
46
|
+
# EOF
|
data/test/test_logger.rb
CHANGED
@@ -6,10 +6,6 @@ module TestLogging
|
|
6
6
|
class TestLogger < Test::Unit::TestCase
|
7
7
|
include LoggingTestCase
|
8
8
|
|
9
|
-
def setup
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
9
|
def test_initialize
|
14
10
|
assert_nothing_raised {::Logging::Logger[:test]}
|
15
11
|
assert_equal ::Logging::Logger[:test], ::Logging::Logger['test']
|
data/test/test_repository.rb
CHANGED
@@ -120,6 +120,38 @@ module TestLogging
|
|
120
120
|
assert_equal 'blah', @repo.to_key(:blah)
|
121
121
|
end
|
122
122
|
|
123
|
+
def test_add_master
|
124
|
+
ary = @repo.instance_variable_get(:@masters)
|
125
|
+
assert true, ary.empty?
|
126
|
+
|
127
|
+
@repo.add_master 'root'
|
128
|
+
assert_equal [:root], ary
|
129
|
+
|
130
|
+
@repo.add_master Object, 'Foo'
|
131
|
+
assert_equal [:root, 'Object', 'Foo'], ary
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_master_for
|
135
|
+
assert_nil @repo.master_for('root')
|
136
|
+
assert_nil @repo.master_for('Foo::Bar::Baz')
|
137
|
+
|
138
|
+
@repo.add_master('Foo')
|
139
|
+
assert_equal 'Foo', @repo.master_for('Foo')
|
140
|
+
assert_equal 'Foo', @repo.master_for('Foo::Bar::Baz')
|
141
|
+
|
142
|
+
@repo.add_master('Foo::Bar::Baz')
|
143
|
+
assert_equal 'Foo', @repo.master_for('Foo')
|
144
|
+
assert_equal 'Foo', @repo.master_for('Foo::Bar')
|
145
|
+
assert_equal 'Foo::Bar::Baz', @repo.master_for('Foo::Bar::Baz')
|
146
|
+
assert_equal 'Foo::Bar::Baz', @repo.master_for('Foo::Bar::Baz::Buz')
|
147
|
+
|
148
|
+
assert_nil @repo.master_for('Bar::Baz::Buz')
|
149
|
+
@repo.add_master 'root'
|
150
|
+
assert_equal :root, @repo.master_for('Bar::Baz::Buz')
|
151
|
+
assert_equal 'Foo', @repo.master_for('Foo::Bar')
|
152
|
+
assert_equal 'Foo::Bar::Baz', @repo.master_for('Foo::Bar::Baz::Buz')
|
153
|
+
end
|
154
|
+
|
123
155
|
end # class TestRepository
|
124
156
|
end # module TestLogging
|
125
157
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logging
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Pease
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-04-
|
12
|
+
date: 2009-04-21 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -62,6 +62,7 @@ files:
|
|
62
62
|
- data/simple_logging.rb
|
63
63
|
- examples/appenders.rb
|
64
64
|
- examples/classes.rb
|
65
|
+
- examples/consolidation.rb
|
65
66
|
- examples/formatting.rb
|
66
67
|
- examples/hierarchies.rb
|
67
68
|
- examples/layouts.rb
|
@@ -124,6 +125,7 @@ files:
|
|
124
125
|
- test/layouts/test_yaml.rb
|
125
126
|
- test/setup.rb
|
126
127
|
- test/test_appender.rb
|
128
|
+
- test/test_consolidate.rb
|
127
129
|
- test/test_layout.rb
|
128
130
|
- test/test_log_event.rb
|
129
131
|
- test/test_logger.rb
|
@@ -175,6 +177,7 @@ test_files:
|
|
175
177
|
- test/layouts/test_pattern.rb
|
176
178
|
- test/layouts/test_yaml.rb
|
177
179
|
- test/test_appender.rb
|
180
|
+
- test/test_consolidate.rb
|
178
181
|
- test/test_layout.rb
|
179
182
|
- test/test_log_event.rb
|
180
183
|
- test/test_logger.rb
|