sml-log4r 1.0.6

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.
Files changed (77) hide show
  1. data/doc/content/contact.html +22 -0
  2. data/doc/content/contribute.html +21 -0
  3. data/doc/content/index.html +90 -0
  4. data/doc/content/license.html +56 -0
  5. data/doc/content/manual.html +449 -0
  6. data/doc/dev/README.developers +40 -0
  7. data/doc/dev/checklist +14 -0
  8. data/doc/dev/things-to-do +2 -0
  9. data/doc/images/crush/logo2.png +0 -0
  10. data/doc/images/log4r-logo.png +0 -0
  11. data/doc/images/logo2.png +0 -0
  12. data/doc/log4r.css +111 -0
  13. data/doc/old/manual.html +348 -0
  14. data/doc/templates/main.html +147 -0
  15. data/examples/README +19 -0
  16. data/examples/customlevels.rb +34 -0
  17. data/examples/fileroll.rb +40 -0
  18. data/examples/log4r_yaml.yaml +0 -0
  19. data/examples/logclient.rb +25 -0
  20. data/examples/logserver.rb +18 -0
  21. data/examples/moderate.xml +29 -0
  22. data/examples/moderateconfig.rb +66 -0
  23. data/examples/myformatter.rb +23 -0
  24. data/examples/outofthebox.rb +21 -0
  25. data/examples/rrconfig.xml +63 -0
  26. data/examples/rrsetup.rb +42 -0
  27. data/examples/simpleconfig.rb +39 -0
  28. data/examples/xmlconfig.rb +25 -0
  29. data/examples/yaml.rb +30 -0
  30. data/src/log4r.rb +17 -0
  31. data/src/log4r/base.rb +74 -0
  32. data/src/log4r/config.rb +9 -0
  33. data/src/log4r/configurator.rb +224 -0
  34. data/src/log4r/formatter/formatter.rb +105 -0
  35. data/src/log4r/formatter/patternformatter.rb +108 -0
  36. data/src/log4r/lib/drbloader.rb +52 -0
  37. data/src/log4r/lib/xmlloader.rb +24 -0
  38. data/src/log4r/logevent.rb +28 -0
  39. data/src/log4r/logger.rb +194 -0
  40. data/src/log4r/loggerfactory.rb +89 -0
  41. data/src/log4r/logserver.rb +28 -0
  42. data/src/log4r/outputter/consoleoutputters.rb +18 -0
  43. data/src/log4r/outputter/datefileoutputter.rb +110 -0
  44. data/src/log4r/outputter/emailoutputter.rb +115 -0
  45. data/src/log4r/outputter/fileoutputter.rb +49 -0
  46. data/src/log4r/outputter/iooutputter.rb +55 -0
  47. data/src/log4r/outputter/outputter.rb +132 -0
  48. data/src/log4r/outputter/outputterfactory.rb +59 -0
  49. data/src/log4r/outputter/remoteoutputter.rb +40 -0
  50. data/src/log4r/outputter/rollingfileoutputter.rb +126 -0
  51. data/src/log4r/outputter/staticoutputter.rb +30 -0
  52. data/src/log4r/outputter/syslogoutputter.rb +75 -0
  53. data/src/log4r/rdoc/configurator +243 -0
  54. data/src/log4r/rdoc/emailoutputter +103 -0
  55. data/src/log4r/rdoc/formatter +39 -0
  56. data/src/log4r/rdoc/log4r +89 -0
  57. data/src/log4r/rdoc/logger +175 -0
  58. data/src/log4r/rdoc/logserver +85 -0
  59. data/src/log4r/rdoc/outputter +108 -0
  60. data/src/log4r/rdoc/patternformatter +128 -0
  61. data/src/log4r/rdoc/syslogoutputter +29 -0
  62. data/src/log4r/rdoc/yamlconfigurator +20 -0
  63. data/src/log4r/repository.rb +65 -0
  64. data/src/log4r/staticlogger.rb +49 -0
  65. data/src/log4r/yamlconfigurator.rb +0 -0
  66. data/tests/include.rb +7 -0
  67. data/tests/runtest.rb +6 -0
  68. data/tests/testbase.rb +45 -0
  69. data/tests/testcustom.rb +33 -0
  70. data/tests/testdefault.rb +25 -0
  71. data/tests/testformatter.rb +29 -0
  72. data/tests/testlogger.rb +198 -0
  73. data/tests/testoutputter.rb +112 -0
  74. data/tests/testpatternformatter.rb +26 -0
  75. data/tests/testxmlconf.rb +51 -0
  76. data/tests/xml/testconf.xml +37 -0
  77. metadata +140 -0
@@ -0,0 +1,42 @@
1
+ # This is a real config file used by a game that I'm working on
2
+ # The XML config file is called rrconfig.xml
3
+
4
+ $: << File.join('..','src')
5
+ require 'log4r'
6
+ require 'log4r/configurator'
7
+ include Log4r
8
+
9
+ # How to format component data - low noise
10
+ class CompFormatter < Formatter
11
+ def format(event)
12
+ buff = event.name + "> "
13
+ if event.data.kind_of?(String) then buff += event.data
14
+ else buff += event.data.inspect end
15
+ return buff + "\n"
16
+ end
17
+ end
18
+
19
+ # Set the logpath. Eventually, this will be determined from the environment.
20
+ Configurator['logpath'] = './logs'
21
+ Configurator.load_xml_file('rrconfig.xml')
22
+
23
+ # the rest is an example
24
+
25
+ Robot = {"name"=>"twonky", "row"=>"3", "col"=>"4"}
26
+
27
+ def do_logging(log)
28
+ log.comp3 Robot
29
+ log.comp2 Robot
30
+ log.comp1 Robot
31
+ log.data "this is a piece of data".split
32
+ log.debug "debugging"
33
+ log.info "a piece of info"
34
+ log.warn "Danger, Will Robinson, danger!"
35
+ log.error "I dropped my Wookie! :("
36
+ log.fatal "kaboom!"
37
+ end
38
+
39
+ Logger.each_logger {|logger| do_logging(logger)}
40
+
41
+ # you can see the results onscreen and in logs/game.log
42
+ # logs/data.log and logs/component.log
@@ -0,0 +1,39 @@
1
+ # Simple configuration example.
2
+ # Where we configure just one logger and make it log to a file and stdout.
3
+
4
+ # add the path to log4r if it isn't installed in a ruby path
5
+ $: << File.join('..','src')
6
+ require "log4r"
7
+
8
+ # First things first, get the root logger and set its level to WARN.
9
+ # This makes the global level WARN. Later on, we can turn off all logging
10
+ # by setting it to OFF right here (or dynamically if you prefer)
11
+ Log4r::Logger.root.level = Log4r::WARN
12
+
13
+ # Remember: By specifying a level, we are saying "Include this level and
14
+ # anything worse." So in this case, we're logging WARN, ERROR and FATAL
15
+
16
+ # create a logger
17
+ log = Log4r::Logger.new("simpleconf")
18
+
19
+ # We want to log to $stderr and a file ./tmp.log
20
+
21
+ # Create an outputter for $stderr. It defaults to the root level WARN
22
+ Log4r::StderrOutputter.new 'console'
23
+ # for the file, we want to log only FATAL and ERROR and don't trunc
24
+ Log4r::FileOutputter.new('logfile',
25
+ :filename=>'logs/simple.log',
26
+ :trunc=>false,
27
+ :level=>Log4r::FATAL)
28
+
29
+ # add the outputters (this method accepts outputter names or references)
30
+ log.add('console','logfile')
31
+
32
+ # Now let's try it out:
33
+ log.debug "debugging"
34
+ log.info "a piece of info"
35
+ log.warn "Danger, Will Robinson, danger!"
36
+ log.error "I dropped my Wookie! :("
37
+ log.fatal "kaboom!"
38
+
39
+ # now run this and compare output to ./tmp.log
@@ -0,0 +1,25 @@
1
+ # This is like moderateconfig.rb, but using an XML config
2
+ # please look at moderate.xml
3
+
4
+ $: << '../src'
5
+
6
+ require 'log4r'
7
+ require 'log4r/configurator'
8
+ include Log4r
9
+
10
+ # set any runtime XML variables
11
+ Configurator['logpath'] = './logs'
12
+ # Load up the config file
13
+ Configurator.load_xml_file('./moderate.xml')
14
+
15
+ # now repeat what moderateconfig.rb does
16
+ def do_logging(log)
17
+ log.debug "debugging"
18
+ log.info "a piece of info"
19
+ log.warn "Danger, Will Robinson, danger!"
20
+ log.error "I dropped my Wookie! :("
21
+ log.fatal "kaboom!"
22
+ end
23
+
24
+ Logger.each_logger{|logger| do_logging(logger) }
25
+ # stop here
@@ -0,0 +1,30 @@
1
+ # Log4r can be configured using YAML. This example uses log4r_yaml.yaml
2
+
3
+ $: << File.join('..','src') # path if log4r is not installed
4
+ require 'log4r'
5
+ require 'log4r/yamlconfigurator'
6
+ # we use various outputters, so require them, otherwise config chokes
7
+ require 'log4r/outputter/datefileoutputter'
8
+ require 'log4r/outputter/emailoutputter'
9
+ include Log4r
10
+
11
+ cfg = YamlConfigurator # shorthand
12
+ cfg['HOME'] = '.' # the only parameter in the YAML, our HOME directory
13
+
14
+ # load the YAML file with this
15
+ cfg.load_yaml_file('log4r_yaml.yaml')
16
+
17
+ # Method to log each of the custom levels
18
+ def do_logging(log)
19
+ log.deb "This is DEB"
20
+ log.inf "This is INF"
21
+ log.prt "This is PRT"
22
+ log.wrn "This is WRN"
23
+ log.err "This is ERR"
24
+ log.fat "This is FAT"
25
+ end
26
+
27
+ # turn off the email outputter
28
+ Outputter['email'].level = OFF
29
+ # the other two outputters log to stderr and a timestamped file in ./logs
30
+ do_logging( Logger['mylogger'])
@@ -0,0 +1,17 @@
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/outputter/fileoutputter"
9
+ require "log4r/outputter/consoleoutputters"
10
+ require "log4r/outputter/staticoutputter"
11
+ require "log4r/outputter/rollingfileoutputter"
12
+ require "log4r/formatter/patternformatter"
13
+ require "log4r/loggerfactory"
14
+
15
+ module Log4r
16
+ Log4rVersion = [1, 0, 1].join '.'
17
+ 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,224 @@
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
+
13
+ # TODO: catch unparsed parameters #{FOO} and die
14
+ module Log4r
15
+ # Gets raised when Configurator encounters bad XML.
16
+ class ConfigError < Exception
17
+ end
18
+
19
+ # See log4r/configurator.rb
20
+ class Configurator
21
+ include REXML if HAVE_REXML
22
+ @@params = Hash.new
23
+
24
+ # Get a parameter's value
25
+ def self.[](param); @@params[param] end
26
+ # Define a parameter with a value
27
+ def self.[]=(param, value); @@params[param] = value end
28
+
29
+ # Sets the custom levels. This method accepts symbols or strings.
30
+ #
31
+ # Configurator.custom_levels('My', 'Custom', :Levels)
32
+ #
33
+ # Alternatively, you can specify custom levels in XML:
34
+ #
35
+ # <log4r_config>
36
+ # <pre_config>
37
+ # <custom_levels>
38
+ # My, Custom, Levels
39
+ # </custom_levels>
40
+ # ...
41
+
42
+ def self.custom_levels(*levels)
43
+ return Logger.root if levels.size == 0
44
+ for i in 0...levels.size
45
+ name = levels[i].to_s
46
+ if name =~ /\s/ or name !~ /^[A-Z]/
47
+ raise TypeError, "#{name} is not a valid Ruby Constant name", caller
48
+ end
49
+ end
50
+ Log4r.define_levels *levels
51
+ end
52
+
53
+ # Given a filename, loads the XML configuration for Log4r.
54
+ def self.load_xml_file(filename)
55
+ detect_rexml
56
+ actual_load Document.new(File.new(filename))
57
+ end
58
+
59
+ # You can load a String XML configuration instead of a file.
60
+ def self.load_xml_string(string)
61
+ detect_rexml
62
+ actual_load Document.new(string)
63
+ end
64
+
65
+ #######
66
+ private
67
+ #######
68
+
69
+ def self.detect_rexml
70
+ unless HAVE_REXML
71
+ raise LoadError,
72
+ "Need REXML to load XML configuration", caller[1..-1]
73
+ end
74
+ end
75
+
76
+ def self.actual_load(doc)
77
+ confignode = doc.elements['//log4r_config']
78
+ if confignode.nil?
79
+ raise ConfigError,
80
+ "<log4r_config> element not defined", caller[1..-1]
81
+ end
82
+ decode_xml(confignode)
83
+ end
84
+
85
+ def self.decode_xml(doc)
86
+ decode_pre_config(doc.elements['pre_config'])
87
+ doc.elements.each('outputter') {|e| decode_outputter(e)}
88
+ doc.elements.each('logger') {|e| decode_logger(e)}
89
+ doc.elements.each('logserver') {|e| decode_logserver(e)}
90
+ end
91
+
92
+ def self.decode_pre_config(e)
93
+ return Logger.root if e.nil?
94
+ decode_custom_levels(e.elements['custom_levels'])
95
+ global_config(e.elements['global'])
96
+ global_config(e.elements['root'])
97
+ decode_parameters(e.elements['parameters'])
98
+ e.elements.each('parameter') {|p| decode_parameter(p)}
99
+ end
100
+
101
+ def self.decode_custom_levels(e)
102
+ return Logger.root if e.nil? or e.text.nil?
103
+ begin custom_levels *Log4rTools.comma_split(e.text)
104
+ rescue TypeError => te
105
+ raise ConfigError, te.message, caller[1..-4]
106
+ end
107
+ end
108
+
109
+ def self.global_config(e)
110
+ return if e.nil?
111
+ globlev = e.value_of 'level'
112
+ return if globlev.nil?
113
+ lev = LNAMES.index(globlev) # find value in LNAMES
114
+ Log4rTools.validate_level(lev, 4) # choke on bad level
115
+ Logger.global.level = lev
116
+ end
117
+
118
+ def self.decode_parameters(e)
119
+ e.elements.each{|p| @@params[p.name] = p.text} unless e.nil?
120
+ end
121
+
122
+ def self.decode_parameter(e)
123
+ @@params[e.value_of('name')] = e.value_of 'value'
124
+ end
125
+
126
+ def self.decode_outputter(e)
127
+ # fields
128
+ name = e.value_of 'name'
129
+ type = e.value_of 'type'
130
+ level = e.value_of 'level'
131
+ only_at = e.value_of 'only_at'
132
+ # validation
133
+ raise ConfigError, "Outputter missing name", caller[1..-3] if name.nil?
134
+ raise ConfigError, "Outputter missing type", caller[1..-3] if type.nil?
135
+ Log4rTools.validate_level(LNAMES.index(level)) unless level.nil?
136
+ only_levels = []
137
+ unless only_at.nil?
138
+ for lev in Log4rTools.comma_split(only_at)
139
+ alev = LNAMES.index(lev)
140
+ Log4rTools.validate_level(alev, 3)
141
+ only_levels.push alev
142
+ end
143
+ end
144
+ formatter = decode_formatter(e.elements['formatter'])
145
+ # build the eval string
146
+ buff = "Outputter[name] = #{type}.new name"
147
+ buff += ",:level=>#{LNAMES.index(level)}" unless level.nil?
148
+ buff += ",:formatter=>formatter" unless formatter.nil?
149
+ params = decode_hash_params(e)
150
+ buff += "," + params.join(',') if params.size > 0
151
+ begin eval buff
152
+ rescue Exception => ae
153
+ raise ConfigError,
154
+ "Problem creating outputter: #{ae.message}", caller[1..-3]
155
+ end
156
+ Outputter[name].only_at *only_levels if only_levels.size > 0
157
+ Outputter[name]
158
+ end
159
+
160
+ def self.decode_formatter(e)
161
+ return nil if e.nil?
162
+ type = e.value_of 'type'
163
+ raise ConfigError, "Formatter missing type", caller[1..-4] if type.nil?
164
+ buff = "#{type}.new " + decode_hash_params(e).join(',')
165
+ begin return eval(buff)
166
+ rescue Exception => ae
167
+ raise ConfigError,
168
+ "Problem creating outputter: #{ae.message}", caller[1..-4]
169
+ end
170
+ end
171
+
172
+ ExcludeParams = %w{formatter level name type}
173
+
174
+ # Does the fancy parameter to hash argument transformation
175
+ def self.decode_hash_params(e)
176
+ buff = []
177
+ e.attributes.each_attribute {|p|
178
+ next if ExcludeParams.include? p.name
179
+ buff << ":" + p.name + "=>" + paramsub(p.value)
180
+ }
181
+ e.elements.each {|p|
182
+ next if ExcludeParams.include? p.name
183
+ buff << ":" + p.name + "=>" + paramsub(p.text)
184
+ }
185
+ buff
186
+ end
187
+
188
+ # Substitues any #{foo} in the XML with Parameter['foo']
189
+ def self.paramsub(str)
190
+ return nil if str.nil?
191
+ @@params.each {|param, value| str.sub! '#{'+param+'}', value}
192
+ "'" + str + "'"
193
+ end
194
+
195
+ def self.decode_logger(e)
196
+ l = Logger.new e.value_of('name')
197
+ decode_logger_common(l, e)
198
+ end
199
+
200
+ def self.decode_logserver(e)
201
+ return unless HAVE_REXML
202
+ name = e.value_of 'name'
203
+ uri = e.value_of 'uri'
204
+ l = LogServer.new name, uri
205
+ decode_logger_common(l, e)
206
+ end
207
+
208
+ def self.decode_logger_common(l, e)
209
+ level = e.value_of 'level'
210
+ additive = e.value_of 'additive'
211
+ trace = e.value_of 'trace'
212
+ l.level = LNAMES.index(level) unless level.nil?
213
+ l.additive = additive unless additive.nil?
214
+ l.trace = trace unless trace.nil?
215
+ # and now for outputters
216
+ outs = e.value_of 'outputters'
217
+ Log4rTools.comma_split(outs).each {|n| l.add n.strip} unless outs.nil?
218
+ e.elements.each('outputter') {|e|
219
+ name = (e.value_of 'name' or e.text)
220
+ l.add Outputter[name]
221
+ }
222
+ end
223
+ end
224
+ end