log4r 1.1.9 → 1.1.10
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/examples/log4r_yaml.yaml +0 -0
- data/examples/yaml.rb +4 -4
- data/lib/log4r.rb +1 -4
- data/lib/log4r/formatter/formatter.rb +1 -1
- data/lib/log4r/formatter/log4jxmlformatter.rb +6 -2
- data/lib/log4r/outputter/fileoutputter.rb +1 -1
- data/lib/log4r/outputter/scribeoutputter.rb +37 -0
- data/lib/log4r/outputter/udpoutputter.rb +2 -2
- data/lib/log4r/rdoc/log4jxmlformatter +21 -0
- data/lib/log4r/rdoc/scribeoutputter +16 -0
- data/lib/log4r/version.rb +4 -0
- data/lib/log4r/yamlconfigurator.rb +24 -22
- data/tests/testGDC.rb +3 -5
- data/tests/testMDC.rb +5 -7
- data/tests/testNDC.rb +3 -5
- data/tests/test_helper.rb +12 -0
- data/tests/testall.rb +1 -1
- data/tests/testbase.rb +8 -9
- data/tests/testchainsaw.rb +1 -7
- data/tests/testcustom.rb +21 -18
- data/tests/testformatter.rb +7 -3
- data/tests/testlogger.rb +16 -12
- data/tests/testoutputter.rb +22 -11
- data/tests/testpatternformatter.rb +8 -10
- data/tests/testthreads.rb +9 -13
- data/tests/testxmlconf.rb +7 -4
- data/tests/testyaml.rb +39 -0
- data/tests/testyaml_arrays.yaml +25 -0
- data/tests/testyaml_injection.yaml +22 -0
- metadata +70 -23
- data/INSTALL +0 -11
- data/LICENSE +0 -90
- data/LICENSE.LGPLv3 +0 -165
- data/README +0 -94
- data/Rakefile +0 -74
- data/TODO +0 -2
data/examples/log4r_yaml.yaml
CHANGED
Binary file
|
data/examples/yaml.rb
CHANGED
@@ -6,9 +6,9 @@ require 'log4r/yamlconfigurator'
|
|
6
6
|
# we use various outputters, so require them, otherwise config chokes
|
7
7
|
require 'log4r/outputter/datefileoutputter'
|
8
8
|
require 'log4r/outputter/emailoutputter'
|
9
|
-
|
9
|
+
require 'log4r/outputter/scribeoutputter'
|
10
10
|
|
11
|
-
cfg = YamlConfigurator # shorthand
|
11
|
+
cfg = Log4r::YamlConfigurator # shorthand
|
12
12
|
cfg['HOME'] = '.' # the only parameter in the YAML, our HOME directory
|
13
13
|
|
14
14
|
# load the YAML file with this
|
@@ -25,6 +25,6 @@ def do_logging(log)
|
|
25
25
|
end
|
26
26
|
|
27
27
|
# turn off the email outputter
|
28
|
-
Outputter['email'].level = OFF
|
28
|
+
Log4r::Outputter['email'].level = Log4r::OFF
|
29
29
|
# the other two outputters log to stderr and a timestamped file in ./logs
|
30
|
-
do_logging( Logger['mylogger'])
|
30
|
+
do_logging( Log4r::Logger['mylogger'])
|
data/lib/log4r.rb
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
# Author:: Leon Torres
|
6
6
|
# Version:: $Id$
|
7
7
|
|
8
|
+
require 'log4r/version'
|
8
9
|
require "log4r/outputter/fileoutputter"
|
9
10
|
require "log4r/outputter/consoleoutputters"
|
10
11
|
require "log4r/outputter/staticoutputter"
|
@@ -14,7 +15,3 @@ require "log4r/loggerfactory"
|
|
14
15
|
require "log4r/GDC"
|
15
16
|
require "log4r/NDC"
|
16
17
|
require "log4r/MDC"
|
17
|
-
|
18
|
-
module Log4r
|
19
|
-
Log4rVersion = [1, 1, 9].join '.'
|
20
|
-
end
|
@@ -70,7 +70,7 @@ module Log4r
|
|
70
70
|
def format_object(obj)
|
71
71
|
if obj.kind_of? Exception
|
72
72
|
return "Caught #{obj.class}: #{obj.message}\n\t" +\
|
73
|
-
obj.backtrace[0...@depth].join("\n\t")
|
73
|
+
(obj.backtrace.nil? ? [] : obj.backtrace[0...@depth]).join("\n\t")
|
74
74
|
elsif obj.kind_of? String
|
75
75
|
return obj
|
76
76
|
else # inspect the object
|
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# :include: ../rdoc/log4jxmlformatter
|
2
2
|
#
|
3
3
|
# == Other Info
|
4
4
|
#
|
@@ -7,7 +7,11 @@
|
|
7
7
|
require "log4r/formatter/formatter"
|
8
8
|
|
9
9
|
require "rubygems"
|
10
|
-
|
10
|
+
begin
|
11
|
+
require "builder"
|
12
|
+
rescue LoadError
|
13
|
+
puts "builder gem is required to use log4jxmlformatter, i.e. gem install builder"
|
14
|
+
end
|
11
15
|
|
12
16
|
module Log4r
|
13
17
|
|
@@ -40,7 +40,7 @@ module Log4r
|
|
40
40
|
|
41
41
|
@filename = _filename
|
42
42
|
if ( @create == true ) then
|
43
|
-
@out = File.new(@filename, (@trunc ? "
|
43
|
+
@out = File.new(@filename, (@trunc ? "wb" : "ab"))
|
44
44
|
Logger.log_internal {
|
45
45
|
"FileOutputter '#{@name}' writing to #{@filename}"
|
46
46
|
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# :nodoc:
|
2
|
+
# Version:: $Id$
|
3
|
+
|
4
|
+
require "log4r/outputter/outputter"
|
5
|
+
require "rubygems"
|
6
|
+
require "scribe"
|
7
|
+
|
8
|
+
module Log4r
|
9
|
+
class ScribeOutputter < Outputter
|
10
|
+
attr_reader :host, :port, :category
|
11
|
+
|
12
|
+
def initialize(_name, hash={})
|
13
|
+
super(_name, hash)
|
14
|
+
@host = (hash[:host] or hash[:host] or 'localhost')
|
15
|
+
@port = (hash[:port] or hash[:port] or '1463')
|
16
|
+
@category = (hash[:category] or hash[:category] or 'default')
|
17
|
+
|
18
|
+
@client = Scribe.new("#{@host}:#{@port}", category=@category, add_newlines=false)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def write(data)
|
24
|
+
begin
|
25
|
+
@client.log(data.strip, @category)
|
26
|
+
rescue ScribeThrift::Client::TransportException => e
|
27
|
+
Logger.log_internal(-2) {
|
28
|
+
"Caught TransportException, is the scribe server alive?"
|
29
|
+
}
|
30
|
+
rescue ThriftClient::NoServersAvailable => e
|
31
|
+
Logger.log_internal(-2) {
|
32
|
+
"No scribe servers are available!"
|
33
|
+
}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
= Configuring Log4r with Log4r::YamlConfigurator
|
2
|
+
|
3
|
+
The YamlConfigurator class allows one to set up Log4r via YAML.
|
4
|
+
It is used almost exactly as Log4r::Configurator and has the same features,
|
5
|
+
|
6
|
+
ycfg = YamlConfigurator # handy shorthand
|
7
|
+
ycfg['foo'] = bar # replaces instances of #{foo} in the YAML with bar
|
8
|
+
ycfg.load_yaml_file('foo.yaml')
|
9
|
+
|
10
|
+
Ruby 1.7 and 1.8 comes with a YAML parser. Hence, YAML can be used
|
11
|
+
to configure Log4r out of the box.
|
12
|
+
|
13
|
+
A comprehensive example of a Log4r YAML configuration is provided in the
|
14
|
+
examples directory.
|
15
|
+
|
16
|
+
To use this class:
|
17
|
+
|
18
|
+
require 'log4r/yamlconfigurator'
|
19
|
+
|
20
|
+
Thanks to Andreas Hund for making this possible.
|
21
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
= ScribeOutputter
|
2
|
+
|
3
|
+
A ScribeOutputter transforms a Log4r::LogEvent into an event passed to Scribe. The user can configure the outputter with
|
4
|
+
the host and port of the scribe scribe server.
|
5
|
+
|
6
|
+
== Usage
|
7
|
+
|
8
|
+
To use,
|
9
|
+
<tt>require 'log4r'</tt>
|
10
|
+
|
11
|
+
An example,
|
12
|
+
|
13
|
+
require 'log4r'
|
14
|
+
|
15
|
+
logger = Log4r::ScribeOutputter.new('name', '127.0.0.1', 1463)
|
16
|
+
logger.debug("Hello World")
|
@@ -119,13 +119,13 @@ module Log4r
|
|
119
119
|
end
|
120
120
|
|
121
121
|
formatter = decode_formatter( op['formatter'])
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
122
|
+
|
123
|
+
opts = {}
|
124
|
+
opts[:level] = LNAMES.index(level) unless level.nil?
|
125
|
+
opts[:formatter] = formatter unless formatter.nil?
|
126
|
+
opts.merge!(decode_hash_params(op))
|
127
|
+
begin
|
128
|
+
Outputter[name] = Log4r.const_get(type).new name, opts
|
129
129
|
rescue Exception => ae
|
130
130
|
raise ConfigError,
|
131
131
|
"Problem creating outputter: #{ae.message}", caller[1..-3]
|
@@ -138,8 +138,8 @@ module Log4r
|
|
138
138
|
return nil if fo.nil?
|
139
139
|
type = fo['type']
|
140
140
|
raise ConfigError, "Formatter missing type", caller[1..-4] if type.nil?
|
141
|
-
|
142
|
-
|
141
|
+
begin
|
142
|
+
return Log4r.const_get(type).new(decode_hash_params(fo))
|
143
143
|
rescue Exception => ae
|
144
144
|
raise ConfigError,
|
145
145
|
"Problem creating outputter: #{ae.message}", caller[1..-4]
|
@@ -149,23 +149,25 @@ module Log4r
|
|
149
149
|
ExcludeParams = %w{formatter level name type only_at}
|
150
150
|
|
151
151
|
# Does the fancy parameter to hash argument transformation
|
152
|
-
def self.decode_hash_params(
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
152
|
+
def self.decode_hash_params(ph)
|
153
|
+
case ph
|
154
|
+
when Hash
|
155
|
+
ph.inject({}){|a,(k,v)| a[k] = self.decode_hash_params(v); a}
|
156
|
+
when Array
|
157
|
+
ph.map{|v| self.decode_hash_params(v)}
|
158
|
+
when String
|
159
|
+
self.paramsub(ph)
|
160
|
+
else
|
161
|
+
ph
|
162
|
+
end
|
159
163
|
end
|
160
|
-
|
164
|
+
|
161
165
|
# Substitues any #{foo} in the YAML with Parameter['foo']
|
162
|
-
def self.paramsub(
|
163
|
-
return nil if str.nil?
|
164
|
-
return nil if str.class != String
|
166
|
+
def self.paramsub(str)
|
165
167
|
@@params.each {|param, value|
|
166
|
-
str.sub
|
168
|
+
str = str.sub("\#{#{param}}", value)
|
167
169
|
}
|
168
|
-
|
170
|
+
str
|
169
171
|
end
|
170
172
|
|
171
173
|
def self.decode_logger( lo)
|
data/tests/testGDC.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
|
2
|
-
require "test/unit"
|
3
|
-
require "log4r"
|
4
|
-
include Log4r
|
1
|
+
require 'test_helper'
|
5
2
|
|
6
|
-
class TestGDC <
|
3
|
+
class TestGDC < TestCase
|
4
|
+
include Log4r
|
7
5
|
|
8
6
|
def test_gdc_default
|
9
7
|
assert(GDC.get() == "testGDC.rb", "Expected 'testGDC.rb' got '#{GDC.get()}'" )
|
data/tests/testMDC.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
|
2
|
-
require "test/unit"
|
3
|
-
require "log4r"
|
4
|
-
include Log4r
|
1
|
+
require 'test_helper'
|
5
2
|
|
6
|
-
class TestMDC <
|
3
|
+
class TestMDC < TestCase
|
4
|
+
include Log4r
|
7
5
|
|
8
6
|
def test_multithread_copy
|
9
7
|
Log4r::MDC.put("user","colbygk")
|
@@ -24,9 +22,9 @@ class TestMDC < Test::Unit::TestCase
|
|
24
22
|
Log4r::MDC.put("string", "string")
|
25
23
|
Log4r::MDC.put(5, "number")
|
26
24
|
l = Logger.new 'test'
|
27
|
-
o = StdoutOutputter.new 'test'
|
25
|
+
o = StdoutOutputter.new 'test'
|
28
26
|
l.add o
|
29
|
-
assert_nothing_raised {
|
27
|
+
assert_nothing_raised {
|
30
28
|
f = PatternFormatter.new :pattern=> "%l user: %X{:user} %X{strng} %X{5}"
|
31
29
|
Outputter['test'].formatter = f
|
32
30
|
l.debug "And this?"
|
data/tests/testNDC.rb
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require 'log4r'
|
5
|
+
require 'log4r/configurator'
|
6
|
+
require 'log4r/staticlogger'
|
7
|
+
require 'log4r/formatter/log4jxmlformatter'
|
8
|
+
require 'log4r/outputter/udpoutputter'
|
9
|
+
require 'log4r/outputter/consoleoutputters'
|
10
|
+
require 'log4r/yamlconfigurator'
|
11
|
+
|
12
|
+
include Test::Unit
|
data/tests/testall.rb
CHANGED
data/tests/testbase.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
include Log4r
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestBase < TestCase
|
4
|
+
include Log4r
|
5
5
|
|
6
|
-
class TestBase < Test::Unit::TestCase
|
7
6
|
# check that LNAMES loads properly (it uses an eval to load)
|
8
7
|
def test_default_levels
|
9
8
|
Logger.root # doing this loads the default levels
|
@@ -20,10 +19,10 @@ class TestBase < Test::Unit::TestCase
|
|
20
19
|
# check bad input and bounds for validate_level
|
21
20
|
def test_validate_level
|
22
21
|
7.times{|i| assert_nothing_raised {Log4rTools.validate_level(i)} }
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
assert_raise(ArgumentError) {Log4rTools.validate_level(-1)}
|
23
|
+
assert_raise(ArgumentError) {Log4rTools.validate_level(LEVELS)}
|
24
|
+
assert_raise(ArgumentError) {Log4rTools.validate_level(String)}
|
25
|
+
assert_raise(ArgumentError) {Log4rTools.validate_level("bogus")}
|
27
26
|
end
|
28
27
|
# decode_bool turns a string 'true' into true and so on
|
29
28
|
def test_decode_bool
|
data/tests/testchainsaw.rb
CHANGED
data/tests/testcustom.rb
CHANGED
@@ -1,27 +1,30 @@
|
|
1
|
+
require 'test_helper'
|
1
2
|
|
2
3
|
# tests the customization of Log4r levels
|
3
4
|
class TestCustom < TestCase
|
5
|
+
include Log4r
|
6
|
+
|
4
7
|
def test_validation
|
5
|
-
|
6
|
-
|
8
|
+
assert_raise(TypeError) { Configurator.custom_levels "lowercase" }
|
9
|
+
assert_raise(TypeError) { Configurator.custom_levels "With space" }
|
7
10
|
end
|
8
11
|
|
9
12
|
def test_create
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
14
|
-
def test_methods
|
15
|
-
l = Logger.new 'custom1'
|
16
|
-
assert_respond_to(:foo, l)
|
17
|
-
assert_respond_to(:foo?, l)
|
18
|
-
assert_respond_to(:bar, l)
|
19
|
-
assert_respond_to(:bar?, l)
|
20
|
-
assert_respond_to(:baz, l)
|
21
|
-
assert_respond_to(:baz?, l)
|
22
|
-
assert_no_exception(NameError) { Bar }
|
23
|
-
assert_no_exception(NameError) { Baz }
|
24
|
-
assert_no_exception(NameError) { Foo }
|
13
|
+
assert_nothing_raised { Configurator.custom_levels "Foo", "Bar", "Baz" }
|
14
|
+
assert_nothing_raised { Configurator.custom_levels }
|
15
|
+
assert_nothing_raised { Configurator.custom_levels "Bogus", "Levels" }
|
25
16
|
end
|
26
|
-
|
17
|
+
# def test_methods
|
18
|
+
# l = Logger.new 'custom1'
|
19
|
+
# assert_respond_to(l, :foo)
|
20
|
+
# assert_respond_to(l, :foo?)
|
21
|
+
# assert_respond_to(l, :bar)
|
22
|
+
# assert_respond_to(l, :bar?)
|
23
|
+
# assert_respond_to(l, :baz)
|
24
|
+
# assert_respond_to(l, :baz?)
|
25
|
+
# assert_nothing_raised { Bar }
|
26
|
+
# assert_nothing_raised { Baz }
|
27
|
+
# assert_nothing_raised { Foo }
|
28
|
+
# end
|
29
|
+
|
27
30
|
end
|
data/tests/testformatter.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
1
3
|
class TestFormatter < TestCase
|
4
|
+
include Log4r
|
5
|
+
|
2
6
|
def test_creation
|
3
|
-
|
4
|
-
|
7
|
+
assert_nothing_raised { Formatter.new.format(3) }
|
8
|
+
assert_nothing_raised { DefaultFormatter.new }
|
5
9
|
assert_kind_of(Formatter, DefaultFormatter.new)
|
6
10
|
end
|
7
11
|
def test_simple_formatter
|
@@ -24,4 +28,4 @@ class TestFormatter < TestCase
|
|
24
28
|
assert_match(b.format(event3), /ArgumentError/)
|
25
29
|
assert_match(b.format(LogEvent.new(0,f,nil,[1,2,3])), /Array/)
|
26
30
|
end
|
27
|
-
end
|
31
|
+
end
|
data/tests/testlogger.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
|
-
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class MyFormatter1 < Log4r::Formatter
|
2
4
|
def format(event)
|
3
5
|
return "MyFormatter1\n"
|
4
6
|
end
|
5
7
|
end
|
6
8
|
|
7
|
-
class MyFormatter2 < Formatter
|
9
|
+
class MyFormatter2 < Log4r::Formatter
|
8
10
|
def format(event)
|
9
11
|
return "MyFormatter2\n"
|
10
12
|
end
|
11
13
|
end
|
12
14
|
|
13
15
|
class TestLogger < TestCase
|
16
|
+
include Log4r
|
17
|
+
|
14
18
|
def test_root
|
15
19
|
l1 = Logger.root
|
16
20
|
l2 = Logger['root']
|
@@ -21,8 +25,8 @@ class TestLogger < TestCase
|
|
21
25
|
assert(l1.parent == nil, "Root's parent wasn't nil!")
|
22
26
|
end
|
23
27
|
def test_validation
|
24
|
-
|
25
|
-
|
28
|
+
assert_raise(ArgumentError) { Logger.new }
|
29
|
+
assert_nothing_raised { Logger.new('validate', nil) }
|
26
30
|
end
|
27
31
|
def test_all_off
|
28
32
|
l = Logger.new("create_method")
|
@@ -45,14 +49,14 @@ class TestLogger < TestCase
|
|
45
49
|
StdoutOutputter.new('fake1')
|
46
50
|
StdoutOutputter.new('fake2')
|
47
51
|
a = Logger.new("add")
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
+
assert_raise(TypeError) { a.add 'bogus' }
|
53
|
+
assert_raise(TypeError) { a.add Class }
|
54
|
+
assert_raise(TypeError) { a.add 'fake1', Class }
|
55
|
+
assert_nothing_raised { a.add 'fake1', 'fake2' }
|
52
56
|
end
|
53
57
|
def test_repository
|
54
|
-
|
55
|
-
|
58
|
+
assert_raise(NameError) { Logger.get('bogusbogus') }
|
59
|
+
assert_nothing_raised { Logger['bogusbogus'] }
|
56
60
|
end
|
57
61
|
def test_heiarchy
|
58
62
|
a = Logger.new("a")
|
@@ -79,7 +83,7 @@ class TestLogger < TestCase
|
|
79
83
|
assert(d.path == "a", "path wasn't set properly")
|
80
84
|
assert(d.level == a.level, "didn't inherit parent's level")
|
81
85
|
assert(d.parent == a, "parent wasn't what is expected")
|
82
|
-
|
86
|
+
assert_raise(ArgumentError) { Logger.new("::a") }
|
83
87
|
end
|
84
88
|
def test_undefined_parents
|
85
89
|
a = Logger.new 'has::no::real::parents::me'
|
@@ -130,7 +134,7 @@ class TestLogger < TestCase
|
|
130
134
|
l = Logger.new 'logblocks'
|
131
135
|
l.level = WARN
|
132
136
|
l.add(Outputter.stdout)
|
133
|
-
|
137
|
+
assert_nothing_raised {
|
134
138
|
l.debug { puts "should not show up"; "LOGBLOCKS" }
|
135
139
|
l.fatal { puts "should show up"; "LOGBLOCKS" }
|
136
140
|
l.fatal { nil }
|