revolutionhealth-log4r 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/LICENSE +20 -0
  2. data/README +37 -0
  3. data/Rakefile +62 -0
  4. data/TODO +4 -0
  5. data/config/log4r.xml +59 -0
  6. data/lib/log4r.rb +29 -0
  7. data/lib/log4r/base.rb +74 -0
  8. data/lib/log4r/config.rb +9 -0
  9. data/lib/log4r/configurator.rb +229 -0
  10. data/lib/log4r/formatter/formatter.rb +105 -0
  11. data/lib/log4r/formatter/patternformatter.rb +110 -0
  12. data/lib/log4r/lib/drbloader.rb +52 -0
  13. data/lib/log4r/lib/xmlloader.rb +24 -0
  14. data/lib/log4r/logevent.rb +28 -0
  15. data/lib/log4r/logger.rb +194 -0
  16. data/lib/log4r/loggerfactory.rb +89 -0
  17. data/lib/log4r/logserver.rb +28 -0
  18. data/lib/log4r/outputter/consoleoutputters.rb +18 -0
  19. data/lib/log4r/outputter/datefileoutputter.rb +110 -0
  20. data/lib/log4r/outputter/emailoutputter.rb +115 -0
  21. data/lib/log4r/outputter/fileoutputter.rb +49 -0
  22. data/lib/log4r/outputter/iooutputter.rb +55 -0
  23. data/lib/log4r/outputter/outputter.rb +132 -0
  24. data/lib/log4r/outputter/outputterfactory.rb +59 -0
  25. data/lib/log4r/outputter/remoteoutputter.rb +40 -0
  26. data/lib/log4r/outputter/rollingfileoutputter.rb +171 -0
  27. data/lib/log4r/outputter/staticoutputter.rb +30 -0
  28. data/lib/log4r/outputter/syslogoutputter.rb +122 -0
  29. data/lib/log4r/repository.rb +65 -0
  30. data/lib/log4r/staticlogger.rb +77 -0
  31. data/lib/log4r/yamlconfigurator.rb +0 -0
  32. data/lib/log4r_logging.rb +21 -0
  33. data/lib/rails_patch_for_migrations.rb +20 -0
  34. data/lib/test/log_sql_per_test.rb +43 -0
  35. data/log4r_original_LICENSE +47 -0
  36. data/test/log4r_test.rb +188 -0
  37. data/test/orig_tests/include.rb +7 -0
  38. data/test/orig_tests/runtest.rb +6 -0
  39. data/test/orig_tests/testbase.rb +45 -0
  40. data/test/orig_tests/testcustom.rb +33 -0
  41. data/test/orig_tests/testdefault.rb +25 -0
  42. data/test/orig_tests/testformatter.rb +29 -0
  43. data/test/orig_tests/testlogger.rb +198 -0
  44. data/test/orig_tests/testoutputter.rb +112 -0
  45. data/test/orig_tests/testpatternformatter.rb +26 -0
  46. data/test/orig_tests/testxmlconf.rb +51 -0
  47. data/test/orig_tests/xml/testconf.xml +37 -0
  48. data/test/test_helper.rb +11 -0
  49. metadata +110 -0
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2007, 2008 Revolution Health
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,37 @@
1
+ log4r
2
+ =====
3
+
4
+ Original manual provided here: http://log4r.sourceforge.net/
5
+
6
+ == Enhancements
7
+
8
+ We have added support for an Nested Diagnostic Context, or NDC and GDC.
9
+
10
+ === NDC
11
+
12
+ NDCs are per thread, and can be set by:
13
+
14
+ Log4r::Logger::NDC.push('something')
15
+
16
+ Then in the configuration xml it can be used:
17
+
18
+ pattern="%x"
19
+
20
+ Which will output the top most diagnostic message on the NDC stack.
21
+
22
+ Based on the log4j NDC implementation: http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/NDC.html
23
+
24
+ === GDC
25
+
26
+ We also added a Global Diagnostic Context for per application diagnostic messages.
27
+
28
+ Log4r::Logger.GDC = "app1"
29
+
30
+ Then in the configuration xml it can be used:
31
+
32
+ pattern="%g"
33
+
34
+ log4_logging.rb uses this to set the message to be the name of the rails application.
35
+ This can be useful for sorting messages if logs for multiple applications are aggregated at a single point,
36
+ for example in something like Splunk.
37
+
@@ -0,0 +1,62 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+ require 'rubygems/specification'
4
+ require 'date'
5
+ require 'fileutils'
6
+
7
+ GEM = "log4r"
8
+ GEM_VERSION = "2.0.0"
9
+ AUTHOR = "Revolution Health"
10
+ EMAIL = "rails-trunk@revolutionhealth.com"
11
+ HOMEPAGE = %q{http://github.com/revolutionhealth/log4r/tree/master}
12
+ SUMMARY = "Updated version of Log4r"
13
+
14
+ spec = Gem::Specification.new do |s|
15
+ s.name = GEM
16
+ s.version = GEM_VERSION
17
+ s.platform = Gem::Platform::RUBY
18
+ s.has_rdoc = false
19
+ s.extra_rdoc_files = ["README", "LICENSE", 'TODO']
20
+ s.summary = SUMMARY
21
+ s.description = s.summary
22
+ s.author = AUTHOR
23
+ s.email = EMAIL
24
+ s.homepage = HOMEPAGE
25
+
26
+ # Uncomment this to add a dependency
27
+ # s.add_dependency "foo"
28
+
29
+ s.require_path = 'lib'
30
+ s.autorequire = GEM
31
+ s.files = %w(LICENSE README Rakefile TODO log4r_original_LICENSE) + Dir.glob("{lib,specs,test,config}/**/*")
32
+ end
33
+
34
+ Rake::GemPackageTask.new(spec) do |pkg|
35
+ pkg.gem_spec = spec
36
+ end
37
+
38
+ desc "install the gem locally"
39
+ task :install => [:package] do
40
+ sh %{sudo gem install pkg/#{GEM}-#{GEM_VERSION}}
41
+ end
42
+
43
+ desc "create a gemspec file"
44
+ task :make_spec do
45
+ File.open("#{GEM}.gemspec", "w") do |file|
46
+ file.puts spec.to_ruby
47
+ end
48
+ end
49
+
50
+ require 'test/unit'
51
+
52
+ task :test do
53
+ FileUtils.mkdir(File.join(File.dirname(__FILE__), %w[log])) if !File.exists?(File.join(File.dirname(__FILE__), %w[log]))
54
+ FileUtils.rm(Dir.glob(File.join(File.dirname(__FILE__), %w[log *])))
55
+ runner = Test::Unit::AutoRunner.new(true)
56
+ runner.to_run << 'test'
57
+ runner.pattern = [/_test.rb$/]
58
+ exit if !runner.run
59
+ end
60
+
61
+ task :default => [:test, :package] do
62
+ end
data/TODO ADDED
@@ -0,0 +1,4 @@
1
+ TODO:
2
+ Fix LICENSE with your name
3
+ Fix Rakefile with your name and contact info
4
+ Add your code to lib/<%= name %>.rb
@@ -0,0 +1,59 @@
1
+ <log4r_config>
2
+ <pre_config>
3
+ <global level="DEBUG"/>
4
+ <parameter name="log_pattern" value="[%5.5l] [%d] [%g] %m"/>
5
+ </pre_config>
6
+
7
+ <outputter name="env_file_log" type="RollingFileOutputter" maxsize="100MB" level="DEBUG" filename="#{RAILS_ROOT}/log/#{RAILS_ENV}.log" trunc="false" maxBackupIndex="2">
8
+ <formatter type="PatternFormatter" pattern="[%5.5l] [%d] [%g] %m"/>
9
+ </outputter>
10
+
11
+ <outputter name="console" type="StdoutOutputter" level="DEBUG">
12
+ <formatter type="PatternFormatter" pattern="[%5.5l] [%d] [%g] %m"/>
13
+ </outputter>
14
+
15
+ <outputter name="syslog" type="SyslogOutputter" level="DEBUG" facility="LOG_LOCAL0" ident="rails">
16
+ <formatter type="PatternFormatter" pattern="[%5.5l] [%g] %m"/> <!-- syslog already has datetime, so dont need in message format -->
17
+ </outputter>
18
+
19
+ <logger name="development" level="DEBUG" outputters="env_file_log"/>
20
+ <logger name="test" level="DEBUG" outputters="env_file_log"/>
21
+ <logger name="production" level="DEBUG" outputters="env_file_log,syslog"/>
22
+
23
+ <!-- db -->
24
+ <outputter name="db_env_file_log" type="RollingFileOutputter" maxsize="100MB" level="DEBUG" filename="#{RAILS_ROOT}/log/#{RAILS_ENV}_database.log" trunc="false" maxBackupIndex="2">
25
+ <formatter type="PatternFormatter" pattern="[%5.5l] [%d] [%g] %m"/>
26
+ </outputter>
27
+
28
+ <logger name="development_db" level="DEBUG" outputters="db_env_file_log"/>
29
+ <logger name="test_db" level="DEBUG" outputters="db_env_file_log"/>
30
+ <logger name="production_db" level="ERROR" outputters="db_env_file_log"/>
31
+
32
+ <!-- ares -->
33
+ <outputter name="ares_env_file_log" type="FileOutputter" level="DEBUG" filename="#{RAILS_ROOT}/log/#{RAILS_ENV}_ares.log" trunc="false" >
34
+ <formatter type="PatternFormatter" pattern="[%5.5l] [%d] [%g] %m"/>
35
+ </outputter>
36
+
37
+ <logger name="development_ares" level="DEBUG" outputters="ares_env_file_log"/>
38
+ <logger name="test_ares" level="DEBUG" outputters="ares_env_file_log"/>
39
+ <logger name="production_ares" level="ERROR" outputters="ares_env_file_log"/>
40
+
41
+ <!-- mailer -->
42
+ <outputter name="mailer_env_file_log" type="RollingFileOutputter" maxsize="100MB" level="DEBUG" filename="#{RAILS_ROOT}/log/#{RAILS_ENV}_mailer.log" trunc="false" maxBackupIndex="2">
43
+ <formatter type="PatternFormatter" pattern="[%5.5l] [%d] [%g] %m"/>
44
+ </outputter>
45
+
46
+ <logger name="development_mailer" level="DEBUG" outputters="mailer_env_file_log"/>
47
+ <logger name="test_mailer" level="DEBUG" outputters="mailer_env_file_log"/>
48
+ <logger name="production_mailer" level="ERROR" outputters="mailer_env_file_log"/>
49
+
50
+ <!-- metrics -->
51
+ <outputter name="metrics_env_file_log" type="RollingFileOutputter" maxsize="100MB" level="DEBUG" filename="#{RAILS_ROOT}/log/#{RAILS_ENV}_metrics.log" trunc="false" maxBackupIndex="2">
52
+ <formatter type="PatternFormatter" pattern="[%5.5l] [%d] [%g] %m"/>
53
+ </outputter>
54
+
55
+ <logger name="development_metrics" level="DEBUG" outputters="metrics_env_file_log"/>
56
+ <logger name="test_metrics" level="DEBUG" outputters="metrics_env_file_log"/>
57
+ <logger name="production_metrics" level="INFO" outputters="metrics_env_file_log"/>
58
+
59
+ </log4r_config>
@@ -0,0 +1,29 @@
1
+ # :include: log4r/rdoc/log4r
2
+ #
3
+ # == Other Info
4
+ #
5
+ # Author:: Leon Torres
6
+ # Version:: $Id: log4r.rb,v 1.10 2002/08/20 04:15:04 cepheus Exp $
7
+
8
+ require 'log4r/configurator'
9
+ require 'log4r/formatter/formatter'
10
+ require "log4r/formatter/patternformatter"
11
+ require "log4r/outputter/fileoutputter"
12
+ require "log4r/outputter/consoleoutputters"
13
+ require "log4r/outputter/staticoutputter"
14
+ require "log4r/outputter/rollingfileoutputter"
15
+ require "log4r/outputter/syslogoutputter"
16
+ require "log4r/loggerfactory"
17
+ require "test/log_sql_per_test.rb"
18
+
19
+ module Log4r
20
+ Log4rVersion = [2, 0, 0].join '.'
21
+ end
22
+
23
+ if defined?(Rails)
24
+ if Rails::VERSION::MAJOR < 2
25
+ require 'rails_patch_for_migrations'
26
+ end
27
+
28
+ require 'log4r_logging'
29
+ end
@@ -0,0 +1,74 @@
1
+ # :nodoc:
2
+ require "log4r/config"
3
+
4
+ module Log4r
5
+ ALL = 0
6
+ LNAMES = ['ALL']
7
+
8
+ # Defines the log levels of the Log4r module at runtime. It is given
9
+ # either the default level spec (when root logger is created) or the
10
+ # user-specified level spec (when Logger.custom_levels is called).
11
+ #
12
+ # The last constant defined by this method is OFF. Other level-sensitive
13
+ # parts of the code check to see if OFF is defined before deciding what
14
+ # to do. The typical action would be to force the creation of RootLogger
15
+ # so that the custom levels get loaded and business can proceed as usual.
16
+ #
17
+ # For purposes of formatting, a constant named MaxLevelLength is defined
18
+ # in this method. It stores the max level name string size.
19
+
20
+ def Log4r.define_levels(*levels) #:nodoc:
21
+ return if const_defined? :OFF
22
+ for i in 0...levels.size
23
+ name = levels[i].to_s
24
+ module_eval "#{name} = #{i} + 1; LNAMES.push '#{name}'"
25
+ end
26
+ module_eval %{
27
+ LNAMES.push 'OFF'
28
+ LEVELS = LNAMES.size
29
+ OFF = LEVELS - 1
30
+ MaxLevelLength = Log4rTools.max_level_str_size
31
+ }
32
+ end
33
+
34
+ # Some common functions
35
+ class Log4rTools
36
+ # Raises ArgumentError if level argument is an invalid level. Depth
37
+ # specifies how many trace entries to remove.
38
+ def self.validate_level(level, depth=0)
39
+ unless valid_level?(level)
40
+ raise ArgumentError, "Log level must be in 0..#{LEVELS}",
41
+ caller[1..-(depth + 1)]
42
+ end
43
+ end
44
+
45
+ def self.valid_level?(lev)
46
+ not lev.nil? and lev.kind_of?(Numeric) and lev >= ALL and lev <= OFF
47
+ end
48
+
49
+ def self.max_level_str_size #:nodoc:
50
+ size = 0
51
+ LNAMES.each {|i| size = i.length if i.length > size}
52
+ size
53
+ end
54
+
55
+ # Shortcut for decoding 'true', 'false', true, false or nil into a bool
56
+ # from a hash parameter. E.g., it looks for true/false values for
57
+ # the keys 'symbol' and :symbol.
58
+
59
+ def self.decode_bool(hash, symbol, default)
60
+ data = hash[symbol]
61
+ data = hash[symbol.to_s] if data.nil?
62
+ return case data
63
+ when 'true',true then true
64
+ when 'false',false then false
65
+ else default
66
+ end
67
+ end
68
+
69
+ # Splits comma-delimited lists with arbitrary \s padding
70
+ def self.comma_split(string)
71
+ string.split(/\s*,\s*/).collect {|s| s.strip}
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,9 @@
1
+ # :nodoc:
2
+ # Version:: $Id: config.rb,v 1.9 2002/01/28 16:05:04 cepheus Exp $
3
+
4
+ module Log4r
5
+ module Log4rConfig #:nodoc:
6
+ LogLevels = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL']
7
+ LoggerPathDelimiter = '::'
8
+ end
9
+ end
@@ -0,0 +1,229 @@
1
+ # :include: rdoc/configurator
2
+ #
3
+ # == Other Info
4
+ #
5
+ # Version:: $Id: configurator.rb,v 1.12 2004/03/17 19:13:07 fando Exp $
6
+
7
+ require "log4r/logger"
8
+ require "log4r/outputter/staticoutputter"
9
+ require "log4r/lib/xmlloader"
10
+ require "log4r/logserver"
11
+ require "log4r/outputter/remoteoutputter"
12
+ require "log4r/outputter/fileoutputter"
13
+ require "log4r/outputter/fileoutputter"
14
+ require "log4r/outputter/consoleoutputters"
15
+ require "log4r/formatter/formatter"
16
+ require "log4r/formatter/patternformatter"
17
+
18
+ # TODO: catch unparsed parameters #{FOO} and die
19
+ module Log4r
20
+ # Gets raised when Configurator encounters bad XML.
21
+ class ConfigError < Exception
22
+ end
23
+
24
+ # See log4r/configurator.rb
25
+ class Configurator
26
+ include REXML if HAVE_REXML
27
+ @@params = Hash.new
28
+
29
+ # Get a parameter's value
30
+ def self.[](param); @@params[param] end
31
+ # Define a parameter with a value
32
+ def self.[]=(param, value); @@params[param] = value end
33
+
34
+ # Sets the custom levels. This method accepts symbols or strings.
35
+ #
36
+ # Configurator.custom_levels('My', 'Custom', :Levels)
37
+ #
38
+ # Alternatively, you can specify custom levels in XML:
39
+ #
40
+ # <log4r_config>
41
+ # <pre_config>
42
+ # <custom_levels>
43
+ # My, Custom, Levels
44
+ # </custom_levels>
45
+ # ...
46
+
47
+ def self.custom_levels(*levels)
48
+ return Logger.root if levels.size == 0
49
+ for i in 0...levels.size
50
+ name = levels[i].to_s
51
+ if name =~ /\s/ or name !~ /^[A-Z]/
52
+ raise TypeError, "#{name} is not a valid Ruby Constant name", caller
53
+ end
54
+ end
55
+ Log4r.define_levels *levels
56
+ end
57
+
58
+ # Given a filename, loads the XML configuration for Log4r.
59
+ def self.load_xml_file(filename)
60
+ detect_rexml
61
+ actual_load Document.new(File.new(filename))
62
+ end
63
+
64
+ # You can load a String XML configuration instead of a file.
65
+ def self.load_xml_string(string)
66
+ detect_rexml
67
+ actual_load Document.new(string)
68
+ end
69
+
70
+ #######
71
+ private
72
+ #######
73
+
74
+ def self.detect_rexml
75
+ unless HAVE_REXML
76
+ raise LoadError,
77
+ "Need REXML to load XML configuration", caller[1..-1]
78
+ end
79
+ end
80
+
81
+ def self.actual_load(doc)
82
+ confignode = doc.elements['//log4r_config']
83
+ if confignode.nil?
84
+ raise ConfigError,
85
+ "<log4r_config> element not defined", caller[1..-1]
86
+ end
87
+ decode_xml(confignode)
88
+ end
89
+
90
+ def self.decode_xml(doc)
91
+ decode_pre_config(doc.elements['pre_config'])
92
+ doc.elements.each('outputter') {|e| decode_outputter(e)}
93
+ doc.elements.each('logger') {|e| decode_logger(e)}
94
+ doc.elements.each('logserver') {|e| decode_logserver(e)}
95
+ end
96
+
97
+ def self.decode_pre_config(e)
98
+ return Logger.root if e.nil?
99
+ decode_custom_levels(e.elements['custom_levels'])
100
+ global_config(e.elements['global'])
101
+ global_config(e.elements['root'])
102
+ decode_parameters(e.elements['parameters'])
103
+ e.elements.each('parameter') {|p| decode_parameter(p)}
104
+ end
105
+
106
+ def self.decode_custom_levels(e)
107
+ return Logger.root if e.nil? or e.text.nil?
108
+ begin custom_levels *Log4rTools.comma_split(e.text)
109
+ rescue TypeError => te
110
+ raise ConfigError, te.message, caller[1..-4]
111
+ end
112
+ end
113
+
114
+ def self.global_config(e)
115
+ return if e.nil?
116
+ globlev = e.value_of 'level'
117
+ return if globlev.nil?
118
+ lev = LNAMES.index(globlev) # find value in LNAMES
119
+ Log4rTools.validate_level(lev, 4) # choke on bad level
120
+ Logger.global.level = lev
121
+ end
122
+
123
+ def self.decode_parameters(e)
124
+ e.elements.each{|p| @@params[p.name] = p.text} unless e.nil?
125
+ end
126
+
127
+ def self.decode_parameter(e)
128
+ @@params[e.value_of('name')] = e.value_of 'value'
129
+ end
130
+
131
+ def self.decode_outputter(e)
132
+ # fields
133
+ name = e.value_of 'name'
134
+ type = e.value_of 'type'
135
+ level = e.value_of 'level'
136
+ only_at = e.value_of 'only_at'
137
+ # validation
138
+ raise ConfigError, "Outputter missing name", caller[1..-3] if name.nil?
139
+ raise ConfigError, "Outputter missing type", caller[1..-3] if type.nil?
140
+ Log4rTools.validate_level(LNAMES.index(level)) unless level.nil?
141
+ only_levels = []
142
+ unless only_at.nil?
143
+ for lev in Log4rTools.comma_split(only_at)
144
+ alev = LNAMES.index(lev)
145
+ Log4rTools.validate_level(alev, 3)
146
+ only_levels.push alev
147
+ end
148
+ end
149
+ formatter = decode_formatter(e.elements['formatter'])
150
+ # build the eval string
151
+ buff = "Outputter[name] = #{type}.new name"
152
+ buff += ",:level=>#{LNAMES.index(level)}" unless level.nil?
153
+ buff += ",:formatter=>formatter" unless formatter.nil?
154
+ params = decode_hash_params(e)
155
+ buff += "," + params.join(',') if params.size > 0
156
+ begin eval buff
157
+ rescue Exception => ae
158
+ raise ConfigError,
159
+ "Problem creating outputter: #{ae.message}", caller[1..-3]
160
+ end
161
+ Outputter[name].only_at *only_levels if only_levels.size > 0
162
+ Outputter[name]
163
+ end
164
+
165
+ def self.decode_formatter(e)
166
+ return nil if e.nil?
167
+ type = e.value_of 'type'
168
+ raise ConfigError, "Formatter missing type", caller[1..-4] if type.nil?
169
+ buff = "#{type}.new " + decode_hash_params(e).join(',')
170
+ begin return eval(buff)
171
+ rescue Exception => ae
172
+ raise ConfigError,
173
+ "Problem creating outputter: #{ae.message}", caller[1..-4]
174
+ end
175
+ end
176
+
177
+ ExcludeParams = %w{formatter level name type}
178
+
179
+ # Does the fancy parameter to hash argument transformation
180
+ def self.decode_hash_params(e)
181
+ buff = []
182
+ e.attributes.each_attribute {|p|
183
+ next if ExcludeParams.include? p.name
184
+ buff << ":" + p.name + "=>" + paramsub(p.value)
185
+ }
186
+ e.elements.each {|p|
187
+ next if ExcludeParams.include? p.name
188
+ buff << ":" + p.name + "=>" + paramsub(p.text)
189
+ }
190
+ buff
191
+ end
192
+
193
+ # Substitues any #{foo} in the XML with Parameter['foo']
194
+ def self.paramsub(str)
195
+ return nil if str.nil?
196
+ @@params.each {|param, value| str.sub! '#{'+param+'}', value}
197
+ "'" + str + "'"
198
+ end
199
+
200
+ def self.decode_logger(e)
201
+ l = Logger.new e.value_of('name')
202
+ decode_logger_common(l, e)
203
+ end
204
+
205
+ def self.decode_logserver(e)
206
+ return unless HAVE_REXML
207
+ name = e.value_of 'name'
208
+ uri = e.value_of 'uri'
209
+ l = LogServer.new name, uri
210
+ decode_logger_common(l, e)
211
+ end
212
+
213
+ def self.decode_logger_common(l, e)
214
+ level = e.value_of 'level'
215
+ additive = e.value_of 'additive'
216
+ trace = e.value_of 'trace'
217
+ l.level = LNAMES.index(level) unless level.nil?
218
+ l.additive = additive unless additive.nil?
219
+ l.trace = trace unless trace.nil?
220
+ # and now for outputters
221
+ outs = e.value_of 'outputters'
222
+ Log4rTools.comma_split(outs).each {|n| l.add n.strip} unless outs.nil?
223
+ e.elements.each('outputter') {|e|
224
+ name = (e.value_of 'name' or e.text)
225
+ l.add Outputter[name]
226
+ }
227
+ end
228
+ end
229
+ end