logging 0.9.3 → 0.9.4
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +12 -0
- data/Manifest.txt +1 -1
- data/{README.txt → README.rdoc} +0 -0
- data/Rakefile +7 -4
- data/lib/logging.rb +28 -1
- data/lib/logging/appenders/growl.rb +6 -2
- data/lib/logging/appenders/rolling_file.rb +6 -4
- data/lib/logging/config/configurator.rb +10 -2
- data/lib/logging/config/yaml_configurator.rb +6 -1
- data/lib/logging/layout.rb +9 -1
- data/lib/logging/logger.rb +1 -1
- data/lib/logging/repository.rb +26 -35
- data/test/appenders/test_rolling_file.rb +21 -0
- data/test/setup.rb +2 -0
- data/test/test_layout.rb +23 -0
- data/test/test_logging.rb +24 -0
- data/test/test_repository.rb +1 -1
- data/test/test_stats.rb +1 -1
- metadata +5 -5
data/History.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
== 0.9.4 / 2008-10-04
|
2
|
+
|
3
|
+
2 minor enhancements
|
4
|
+
- Flag to suppress exception backtraces from being logged
|
5
|
+
- Cleaning up color codes on Growl output
|
6
|
+
4 bug fixes
|
7
|
+
- Child loggers were not being found in some cases
|
8
|
+
- RollingFileAppender fails to reopen the log file if
|
9
|
+
the log file is deleted.
|
10
|
+
- Fixed a copy/paste error in the YAML configurator
|
11
|
+
- Bug in the configurator where a nil object was being used
|
12
|
+
|
1
13
|
== 0.9.3 / 2008-09-12
|
2
14
|
|
3
15
|
2 minor enhancement
|
data/Manifest.txt
CHANGED
data/{README.txt → README.rdoc}
RENAMED
File without changes
|
data/Rakefile
CHANGED
@@ -12,14 +12,17 @@ PROJ.authors = 'Tim Pease'
|
|
12
12
|
PROJ.email = 'tim.pease@gmail.com'
|
13
13
|
PROJ.url = 'http://logging.rubyforge.org/'
|
14
14
|
PROJ.rubyforge.name = 'logging'
|
15
|
-
PROJ.rdoc.dir = 'doc/rdoc'
|
16
|
-
#PROJ.rdoc.remote_dir = 'rdoc'
|
17
|
-
PROJ.rdoc.remote_dir = ''
|
18
15
|
PROJ.version = Logging::VERSION
|
19
|
-
PROJ.
|
16
|
+
PROJ.readme_file = 'README.rdoc'
|
20
17
|
|
21
18
|
PROJ.exclude << %w[^tags$ ^tasks/archive ^coverage]
|
22
19
|
PROJ.rdoc.exclude << '^data'
|
20
|
+
PROJ.rdoc.include << PROJ.readme_file
|
21
|
+
PROJ.rdoc.main = PROJ.readme_file
|
22
|
+
#PROJ.rdoc.dir = 'doc/rdoc'
|
23
|
+
#PROJ.rdoc.remote_dir = 'rdoc'
|
24
|
+
PROJ.rdoc.dir = 'doc'
|
25
|
+
PROJ.rdoc.remote_dir = ''
|
23
26
|
|
24
27
|
PROJ.ann.email[:server] = 'smtp.gmail.com'
|
25
28
|
PROJ.ann.email[:port] = 587
|
data/lib/logging.rb
CHANGED
@@ -13,7 +13,7 @@ begin require 'fastthread'; rescue LoadError; end
|
|
13
13
|
module Logging
|
14
14
|
|
15
15
|
# :stopdoc:
|
16
|
-
VERSION = '0.9.
|
16
|
+
VERSION = '0.9.4'
|
17
17
|
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
18
18
|
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
19
19
|
WIN32 = %r/djgpp|(cyg|ms|bcc)win|mingw/ =~ RUBY_PLATFORM
|
@@ -227,6 +227,31 @@ module Logging
|
|
227
227
|
module_eval "OBJ_FORMAT = :#{f}", __FILE__, __LINE__
|
228
228
|
end
|
229
229
|
|
230
|
+
# call-seq:
|
231
|
+
# Logging.backtrace #=> true or false
|
232
|
+
# Logging.backtrace( value ) #=> true or false
|
233
|
+
#
|
234
|
+
# Without any arguments, returns the global exception backtrace logging
|
235
|
+
# value. When set to +true+ backtraces will be written to the logs; when
|
236
|
+
# set to +false+ backtraces will be suppressed.
|
237
|
+
#
|
238
|
+
# When an argument is given the global exception backtrace setting will
|
239
|
+
# be changed. Value values are <tt>"on"</tt>, <tt>:on<tt> and +true+ to
|
240
|
+
# turn on backtraces and <tt>"off"</tt>, <tt>:off</tt> and +false+ to
|
241
|
+
# turn off backtraces.
|
242
|
+
#
|
243
|
+
def backtrace( b = nil )
|
244
|
+
@backtrace = true unless defined? @backtrace
|
245
|
+
return @backtrace if b.nil?
|
246
|
+
|
247
|
+
@backtrace = case b
|
248
|
+
when :on, 'on', true; true
|
249
|
+
when :off, 'off', false; false
|
250
|
+
else
|
251
|
+
raise ArgumentError, "backtrace must be true or false"
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
230
255
|
# Returns the version string for the library.
|
231
256
|
#
|
232
257
|
def version
|
@@ -331,6 +356,8 @@ module Logging
|
|
331
356
|
children.sort {|a,b| a.name <=> b.name}.each do |child|
|
332
357
|
::Logging.show_configuration(io, child, indent)
|
333
358
|
end
|
359
|
+
|
360
|
+
nil
|
334
361
|
end
|
335
362
|
|
336
363
|
# :stopdoc:
|
@@ -9,6 +9,10 @@ module Logging::Appenders
|
|
9
9
|
#
|
10
10
|
class Growl < ::Logging::Appender
|
11
11
|
|
12
|
+
# :stopdoc:
|
13
|
+
ColoredRegexp = %r/\e\[([34][0-7]|[0-9])m/
|
14
|
+
# :startdoc:
|
15
|
+
|
12
16
|
# call-seq:
|
13
17
|
# Growl.new( name, opts = {} )
|
14
18
|
#
|
@@ -84,13 +88,13 @@ module Logging::Appenders
|
|
84
88
|
end
|
85
89
|
return if message.empty?
|
86
90
|
|
91
|
+
message = message.gsub(ColoredRegexp, '')
|
87
92
|
if @title_sep
|
88
93
|
title, message = message.split(@title_sep)
|
89
94
|
title, message = '', title if message.nil?
|
90
|
-
title.strip!
|
91
95
|
end
|
92
96
|
|
93
|
-
growl(title, message, priority)
|
97
|
+
growl(title.strip, message.strip, priority)
|
94
98
|
self
|
95
99
|
end
|
96
100
|
|
@@ -270,11 +270,13 @@ module Logging::Appenders
|
|
270
270
|
def check_logfile
|
271
271
|
retry_cnt ||= 0
|
272
272
|
|
273
|
-
|
274
|
-
|
275
|
-
|
273
|
+
if ::File.exist?(@fn) then
|
274
|
+
@stat = ::File.stat(@fn)
|
275
|
+
return unless @lockfile
|
276
|
+
return if @inode == @stat.ino
|
276
277
|
|
277
|
-
|
278
|
+
@io.close rescue nil
|
279
|
+
end
|
278
280
|
open_logfile
|
279
281
|
rescue SystemCallError
|
280
282
|
raise if retry_cnt > 3
|
@@ -29,6 +29,7 @@ module Logging::Config
|
|
29
29
|
dsl.__instance_eval(&block)
|
30
30
|
|
31
31
|
pre_config dsl.__pre_config
|
32
|
+
::Logging::Logger[:root] # ensures the log levels are defined
|
32
33
|
appenders dsl.__appenders
|
33
34
|
loggers dsl.__loggers
|
34
35
|
end
|
@@ -52,6 +53,10 @@ module Logging::Config
|
|
52
53
|
# format as
|
53
54
|
format = config[:format_as]
|
54
55
|
::Logging.format_as(format) unless format.nil?
|
56
|
+
|
57
|
+
# backtrace
|
58
|
+
value = config[:backtrace]
|
59
|
+
::Logging.backtrace(value) unless value.nil?
|
55
60
|
end
|
56
61
|
|
57
62
|
# call-seq:
|
@@ -157,17 +162,20 @@ module Logging::Config
|
|
157
162
|
class TopLevelDSL < DSL
|
158
163
|
undef_method :method_missing
|
159
164
|
|
165
|
+
def initialize
|
166
|
+
@loggers = []
|
167
|
+
@appenders = []
|
168
|
+
end
|
169
|
+
|
160
170
|
def pre_config( &block )
|
161
171
|
__store(:preconfig, DSL.process(&block))
|
162
172
|
end
|
163
173
|
|
164
174
|
def logger( name, &block )
|
165
|
-
@loggers ||= []
|
166
175
|
@loggers << [name, DSL.process(&block)]
|
167
176
|
end
|
168
177
|
|
169
178
|
def appender( name, &block )
|
170
|
-
@appenders ||= []
|
171
179
|
@appenders << [name, DSL.process(&block)]
|
172
180
|
end
|
173
181
|
|
@@ -71,6 +71,7 @@ module Config
|
|
71
71
|
#
|
72
72
|
def load
|
73
73
|
pre_config @config['pre_config']
|
74
|
+
::Logging::Logger[:root] # ensures the log levels are defined
|
74
75
|
appenders @config['appenders']
|
75
76
|
loggers @config['loggers']
|
76
77
|
end
|
@@ -94,6 +95,10 @@ module Config
|
|
94
95
|
format = config['format_as']
|
95
96
|
::Logging.format_as(format) unless format.nil?
|
96
97
|
|
98
|
+
# backtrace
|
99
|
+
value = config['backtrace']
|
100
|
+
::Logging.backtrace(value) unless value.nil?
|
101
|
+
|
97
102
|
# grab the root logger and set the logging level
|
98
103
|
root = ::Logging::Logger.root
|
99
104
|
if config.has_key?('root')
|
@@ -156,7 +161,7 @@ module Config
|
|
156
161
|
raise Error, 'Appender type not given' if type.nil?
|
157
162
|
|
158
163
|
name = config.delete('name')
|
159
|
-
raise Error, 'Appender name not given' if
|
164
|
+
raise Error, 'Appender name not given' if name.nil?
|
160
165
|
|
161
166
|
config['layout'] = layout(config.delete('layout'))
|
162
167
|
|
data/lib/logging/layout.rb
CHANGED
@@ -39,6 +39,14 @@ class Layout
|
|
39
39
|
@obj_format = case f
|
40
40
|
when :inspect, :yaml; f
|
41
41
|
else :string end
|
42
|
+
|
43
|
+
b = opts.getopt(:backtrace, ::Logging.backtrace)
|
44
|
+
@backtrace = case b
|
45
|
+
when :on, 'on', true; true
|
46
|
+
when :off, 'off', false; false
|
47
|
+
else
|
48
|
+
raise ArgumentError, "backtrace must be true or false"
|
49
|
+
end
|
42
50
|
end
|
43
51
|
|
44
52
|
# call-seq:
|
@@ -79,7 +87,7 @@ class Layout
|
|
79
87
|
when String; obj
|
80
88
|
when Exception
|
81
89
|
str = "<#{obj.class.name}> #{obj.message}"
|
82
|
-
|
90
|
+
if @backtrace && !obj.backtrace.nil?
|
83
91
|
str << "\n\t" << obj.backtrace.join("\n\t")
|
84
92
|
end
|
85
93
|
str
|
data/lib/logging/logger.rb
CHANGED
@@ -53,6 +53,7 @@ module Logging
|
|
53
53
|
if logger.nil?
|
54
54
|
logger = super(name, *args)
|
55
55
|
repo[name] = logger
|
56
|
+
repo.children(name).each {|c| c.__send__(:parent=, logger)}
|
56
57
|
end
|
57
58
|
logger
|
58
59
|
end
|
@@ -142,7 +143,6 @@ module Logging
|
|
142
143
|
|
143
144
|
repo = ::Logging::Repository.instance
|
144
145
|
_setup(name, :parent => repo.parent(name))
|
145
|
-
repo.children(name).each {|c| c.parent = self}
|
146
146
|
end
|
147
147
|
|
148
148
|
# call-seq:
|
data/lib/logging/repository.rb
CHANGED
@@ -107,17 +107,9 @@ module Logging
|
|
107
107
|
# of B is A. Parents are determined by namespace.
|
108
108
|
#
|
109
109
|
def parent( key )
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
a = key.split PATH_DELIMITER
|
114
|
-
|
115
|
-
p = @h[:root]
|
116
|
-
while a.slice!(-1) and !a.empty?
|
117
|
-
k = a.join PATH_DELIMITER
|
118
|
-
if @h.has_key? k then p = @h[k]; break end
|
119
|
-
end
|
120
|
-
p
|
110
|
+
name = _parent_name(to_key(key))
|
111
|
+
return if name.nil?
|
112
|
+
@h[name]
|
121
113
|
end
|
122
114
|
|
123
115
|
# call-seq:
|
@@ -128,31 +120,15 @@ module Logging
|
|
128
120
|
# +Repository#[]+. Children are returned regardless of the
|
129
121
|
# existence of the logger referenced by _key_.
|
130
122
|
#
|
131
|
-
def children(
|
132
|
-
|
133
|
-
|
134
|
-
ary = []
|
135
|
-
@h.each_pair do |key,logger|
|
136
|
-
key = key.to_s
|
137
|
-
next if key == 'root'
|
138
|
-
next if key.index(PATH_DELIMITER)
|
139
|
-
ary << logger
|
140
|
-
end
|
141
|
-
return ary.sort
|
142
|
-
end
|
123
|
+
def children( parent )
|
124
|
+
ary = []
|
125
|
+
parent = to_key(parent)
|
143
126
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
if k =~ rgxp
|
150
|
-
l = @h[k]
|
151
|
-
d = l.parent.name.split(PATH_DELIMITER).length
|
152
|
-
if d <= depth then l else nil end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
a.compact.sort
|
127
|
+
@h.each_pair do |child,logger|
|
128
|
+
next if :root == child
|
129
|
+
ary << logger if parent == _parent_name(child)
|
130
|
+
end
|
131
|
+
return ary.sort
|
156
132
|
end
|
157
133
|
|
158
134
|
# call-seq:
|
@@ -175,6 +151,21 @@ module Logging
|
|
175
151
|
end
|
176
152
|
end
|
177
153
|
|
154
|
+
# Returns the name of the parent for the logger identified by the given
|
155
|
+
# _key_. If the _key_ is for the root logger, then +nil+ is returned.
|
156
|
+
#
|
157
|
+
def _parent_name( key )
|
158
|
+
return if :root == key
|
159
|
+
|
160
|
+
a = key.split PATH_DELIMITER
|
161
|
+
p = :root
|
162
|
+
while a.slice!(-1) and !a.empty?
|
163
|
+
k = a.join PATH_DELIMITER
|
164
|
+
if @h.has_key? k then p = k; break end
|
165
|
+
end
|
166
|
+
p
|
167
|
+
end
|
168
|
+
|
178
169
|
end # class Repository
|
179
170
|
end # module Logging
|
180
171
|
|
@@ -171,6 +171,27 @@ module TestAppenders
|
|
171
171
|
cleanup
|
172
172
|
end
|
173
173
|
|
174
|
+
def test_file_removed
|
175
|
+
assert_equal [], Dir.glob(@glob)
|
176
|
+
|
177
|
+
ap = ::Logging::Appenders::RollingFile.new(NAME,
|
178
|
+
:filename => @fn, :size => 100)
|
179
|
+
|
180
|
+
ap << 'X' * 100; ap.flush
|
181
|
+
assert_equal 1, Dir.glob(@glob).length
|
182
|
+
assert_equal 100, File.size(@fn)
|
183
|
+
|
184
|
+
# Now remove @fn and make sure that the log file is written to
|
185
|
+
# again
|
186
|
+
File.unlink(@fn)
|
187
|
+
assert_equal 0, Dir.glob(@glob).length
|
188
|
+
|
189
|
+
ap << 'X' * 50; ap.flush
|
190
|
+
assert_equal 1, Dir.glob(@glob).length
|
191
|
+
assert_equal 50, File.size(@fn)
|
192
|
+
|
193
|
+
end
|
194
|
+
|
174
195
|
private
|
175
196
|
def cleanup
|
176
197
|
unless ::Logging::Appender[NAME].nil?
|
data/test/setup.rb
CHANGED
@@ -53,6 +53,8 @@ module LoggingTestCase
|
|
53
53
|
|
54
54
|
def teardown
|
55
55
|
super
|
56
|
+
::Logging.backtrace
|
57
|
+
::Logging.__send__(:remove_instance_variable, :@backtrace)
|
56
58
|
h = ::Logging::Appender.instance_variable_get(:@appenders)
|
57
59
|
h.each_value {|a| a.close(false) unless a.nil? || a.closed?}
|
58
60
|
h.clear
|
data/test/test_layout.rb
CHANGED
@@ -78,6 +78,29 @@ module TestLogging
|
|
78
78
|
assert_equal "<Array> \n--- \n- one\n- two\n- three\n- four\n", r
|
79
79
|
end
|
80
80
|
|
81
|
+
def test_format_obj_without_backtrace
|
82
|
+
@layout = ::Logging::Layout.new :backtrace => 'off'
|
83
|
+
|
84
|
+
obj = Exception.new 'some exception'
|
85
|
+
obj.set_backtrace %w( this is the backtrace )
|
86
|
+
r = @layout.send :format_obj, obj
|
87
|
+
obj = "<Exception> some exception"
|
88
|
+
assert_equal obj, r
|
89
|
+
|
90
|
+
::Logging.backtrace :off
|
91
|
+
@layout = ::Logging::Layout.new
|
92
|
+
|
93
|
+
obj = ArgumentError.new 'wrong type of argument'
|
94
|
+
obj.set_backtrace %w( this is the backtrace )
|
95
|
+
r = @layout.send :format_obj, obj
|
96
|
+
obj = "<ArgumentError> wrong type of argument"
|
97
|
+
assert_equal obj, r
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_initializer
|
101
|
+
assert_raise(ArgumentError) {::Logging::Layout.new :backtrace => 'foo'}
|
102
|
+
end
|
103
|
+
|
81
104
|
end # class TestLayout
|
82
105
|
end # module TestLogging
|
83
106
|
|
data/test/test_logging.rb
CHANGED
@@ -15,6 +15,30 @@ module TestLogging
|
|
15
15
|
@glob = File.join(TMP, '*.log')
|
16
16
|
end
|
17
17
|
|
18
|
+
def test_backtrace
|
19
|
+
assert_equal true, ::Logging.backtrace
|
20
|
+
|
21
|
+
assert_equal false, ::Logging.backtrace('off')
|
22
|
+
assert_equal false, ::Logging.backtrace
|
23
|
+
|
24
|
+
assert_equal true, ::Logging.backtrace('on')
|
25
|
+
assert_equal true, ::Logging.backtrace
|
26
|
+
|
27
|
+
assert_equal false, ::Logging.backtrace(:off)
|
28
|
+
assert_equal false, ::Logging.backtrace
|
29
|
+
|
30
|
+
assert_equal true, ::Logging.backtrace(:on)
|
31
|
+
assert_equal true, ::Logging.backtrace
|
32
|
+
|
33
|
+
assert_equal false, ::Logging.backtrace(false)
|
34
|
+
assert_equal false, ::Logging.backtrace
|
35
|
+
|
36
|
+
assert_equal true, ::Logging.backtrace(true)
|
37
|
+
assert_equal true, ::Logging.backtrace
|
38
|
+
|
39
|
+
assert_raise(ArgumentError) {::Logging.backtrace 'foo'}
|
40
|
+
end
|
41
|
+
|
18
42
|
def test_configure
|
19
43
|
assert_raise(ArgumentError) {::Logging.configure 'blah.txt'}
|
20
44
|
|
data/test/test_repository.rb
CHANGED
data/test/test_stats.rb
CHANGED
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: 0.9.
|
4
|
+
version: 0.9.4
|
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: 2008-
|
12
|
+
date: 2008-10-07 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -40,11 +40,11 @@ extensions: []
|
|
40
40
|
|
41
41
|
extra_rdoc_files:
|
42
42
|
- History.txt
|
43
|
-
- README.
|
43
|
+
- README.rdoc
|
44
44
|
files:
|
45
45
|
- History.txt
|
46
46
|
- Manifest.txt
|
47
|
-
- README.
|
47
|
+
- README.rdoc
|
48
48
|
- Rakefile
|
49
49
|
- data/bad_logging_1.rb
|
50
50
|
- data/bad_logging_2.rb
|
@@ -109,7 +109,7 @@ homepage: http://logging.rubyforge.org/
|
|
109
109
|
post_install_message:
|
110
110
|
rdoc_options:
|
111
111
|
- --main
|
112
|
-
- README.
|
112
|
+
- README.rdoc
|
113
113
|
require_paths:
|
114
114
|
- lib
|
115
115
|
required_ruby_version: !ruby/object:Gem::Requirement
|