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,132 @@
1
+ # :include: ../rdoc/outputter
2
+ #
3
+ # == Other Info
4
+ #
5
+ # Version:: $Id: outputter.rb,v 1.6 2003/09/12 23:55:43 fando Exp $
6
+ # Author:: Leon Torres <leon@ugcs.caltech.edu>
7
+
8
+ require "thread"
9
+
10
+ require "log4r/outputter/outputterfactory"
11
+ require "log4r/formatter/formatter"
12
+ require "log4r/staticlogger"
13
+
14
+ module Log4r
15
+
16
+ class Outputter
17
+ attr_reader :name, :level, :formatter
18
+ @@outputters = Hash.new
19
+
20
+ # An Outputter needs a name. RootLogger will be loaded if not already
21
+ # done. The hash arguments are as follows:
22
+ #
23
+ # [<tt>:level</tt>] Logger level. Optional, defaults to root level
24
+ # [<tt>:formatter</tt>] A Formatter. Defaults to DefaultFormatter
25
+
26
+ def initialize(_name, hash={})
27
+ if _name.nil?
28
+ raise ArgumentError, "Bad arguments. Name and IO expected.", caller
29
+ end
30
+ @name = _name
31
+ validate_hash(hash)
32
+ @@outputters[@name] = self
33
+ end
34
+
35
+ # dynamically change the level
36
+ def level=(_level)
37
+ Log4rTools.validate_level(_level)
38
+ @level = _level
39
+ OutputterFactory.create_methods(self)
40
+ Logger.log_internal {"Outputter '#{@name}' level is #{LNAMES[_level]}"}
41
+ end
42
+
43
+ # Set the levels to log. All others will be ignored
44
+ def only_at(*levels)
45
+ raise ArgumentError, "Gimme some levels!", caller if levels.empty?
46
+ raise ArgumentError, "Can't log only_at ALL", caller if levels.include? ALL
47
+ levels.each {|level| Log4rTools.validate_level(level)}
48
+ @level = levels.sort.first
49
+ OutputterFactory.create_methods self, levels
50
+ Logger.log_internal {
51
+ "Outputter '#{@name}' writes only on " +\
52
+ levels.collect{|l| LNAMES[l]}.join(", ")
53
+ }
54
+ end
55
+
56
+ # Dynamically change the formatter. You can just specify a Class
57
+ # object and the formatter will invoke +new+ or +instance+
58
+ # on it as appropriate.
59
+
60
+ def formatter=(_formatter)
61
+ if _formatter.kind_of?(Formatter)
62
+ @formatter = _formatter
63
+ elsif _formatter.kind_of?(Class) and _formatter <= Formatter
64
+ if _formatter.respond_to? :instance
65
+ @formatter = _formatter.instance
66
+ else
67
+ @formatter = _formatter.new
68
+ end
69
+ else
70
+ raise TypeError, "Argument was not a Formatter!", caller
71
+ end
72
+ Logger.log_internal {"Outputter '#{@name}' using #{@formatter.class}"}
73
+ end
74
+
75
+ # Call flush to force an outputter to write out any buffered
76
+ # log events. Similar to IO#flush, so use in a similar fashion.
77
+
78
+ def flush
79
+ end
80
+
81
+ #########
82
+ protected
83
+ #########
84
+
85
+ # Validates the common hash arguments. For now, that would be
86
+ # +:level+, +:formatter+ and the string equivalents
87
+ def validate_hash(hash)
88
+ @mutex = Mutex.new
89
+ # default to root level and DefaultFormatter
90
+ if hash.empty?
91
+ self.level = Logger.root.level
92
+ @formatter = DefaultFormatter.new
93
+ return
94
+ end
95
+ self.level = (hash[:level] or hash['level'] or Logger.root.level)
96
+ self.formatter = (hash[:formatter] or hash['formatter'] or DefaultFormatter.new)
97
+ end
98
+
99
+ #######
100
+ private
101
+ #######
102
+
103
+ # This method handles all log events passed to a typical Outputter.
104
+ # Overload this to change the overall behavior of an outputter. Make
105
+ # sure that the new behavior is thread safe.
106
+
107
+ def canonical_log(logevent)
108
+ synch { write(format(logevent)) }
109
+ end
110
+
111
+ # Common method to format data. All it does is call the resident
112
+ # formatter's format method. If a different formatting behavior is
113
+ # needed, then overload this method.
114
+
115
+ def format(logevent)
116
+ # @formatter is guaranteed to be DefaultFormatter if no Formatter
117
+ # was specified
118
+ @formatter.format(logevent)
119
+ end
120
+
121
+ # Abstract method to actually write the data to a destination.
122
+ # Custom outputters should overload this to specify how the
123
+ # formatted data should be written and to where.
124
+
125
+ def write(data)
126
+ end
127
+
128
+ def synch; @mutex.synchronize { yield } end
129
+
130
+ end
131
+
132
+ end
@@ -0,0 +1,59 @@
1
+ # :nodoc:
2
+ # Version: $Id: outputterfactory.rb,v 1.3 2002/01/28 16:05:05 cepheus Exp $
3
+
4
+ require "log4r/base"
5
+ require "log4r/repository"
6
+ require "log4r/logger"
7
+
8
+ module Log4r
9
+ class Outputter
10
+
11
+ class OutputterFactory #:nodoc:
12
+ include Singleton
13
+
14
+ # handles two cases: logging above a level (no second arg specified)
15
+ # or logging a set of levels (passed into the second argument)
16
+ def self.create_methods(out, levels=nil)
17
+ Logger.root # force levels to be loaded
18
+
19
+ # first, undefine all the log levels
20
+ for mname in LNAMES
21
+ undefine_log(mname.downcase, out)
22
+ end
23
+ if not levels.nil? and levels.include? OFF
24
+ raise TypeError, "Can't log only_at OFF", caller[1..-1]
25
+ end
26
+ return out if out.level == OFF
27
+
28
+ if levels.nil? # then define the log methods for lev >= outlev
29
+ for lev in out.level...LEVELS
30
+ define_log(LNAMES[lev].downcase, lev, out)
31
+ end
32
+ else # define the logs only for assigned levels
33
+ for lev in levels
34
+ define_log(LNAMES[lev].downcase, lev, out)
35
+ end
36
+ end
37
+ return out
38
+ end
39
+
40
+ # we need to synch the actual write/format for thread safteyness
41
+ def self.define_log(mname, level, out)
42
+ return if mname == 'off' || mname == 'all'
43
+ mstr = %-
44
+ def out.#{mname}(logevent)
45
+ canonical_log(logevent)
46
+ end
47
+ -
48
+ module_eval mstr
49
+ end
50
+
51
+ def self.undefine_log(mname, out)
52
+ return if mname == 'off' || mname == 'all'
53
+ mstr = "def out.#{mname}(logevent); end"
54
+ module_eval mstr
55
+ end
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,40 @@
1
+ # :nodoc:
2
+ require 'log4r/lib/drbloader'
3
+ require 'log4r/outputter/outputter'
4
+
5
+ module Log4r
6
+ # See log4r/logserver.rb
7
+ class RemoteOutputter < Outputter
8
+
9
+ def initialize(_name, hash={})
10
+ super(_name, hash)
11
+ @uri = (hash[:uri] or hash['uri'])
12
+ @buffsize = (hash[:buffsize] or hash['buffsize'] or 1).to_i
13
+ @buff = []
14
+ connect
15
+ end
16
+
17
+ if HAVE_ROMP
18
+ include ROMPClient
19
+ else
20
+ def initialize(*args)
21
+ raise RuntimeError, "LogServer not supported. ROMP is required", caller
22
+ end
23
+ end
24
+
25
+
26
+ # Call flush to send any remaining LogEvents to the remote server.
27
+ def flush
28
+ synch { send_buffer }
29
+ end
30
+
31
+ private
32
+
33
+ def canonical_log(logevent)
34
+ synch {
35
+ @buff.push logevent
36
+ send_buffer if @buff.size >= @buffsize
37
+ }
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,126 @@
1
+
2
+ # :nodoc:
3
+ # Version:: $Id: rollingfileoutputter.rb,v 1.4 2003/09/12 23:55:43 fando Exp $
4
+
5
+ require "log4r/outputter/fileoutputter"
6
+ require "log4r/staticlogger"
7
+
8
+ module Log4r
9
+
10
+ # RollingFileOutputter - subclass of FileOutputter that rolls files on size
11
+ # or time. Additional hash arguments are:
12
+ #
13
+ # [<tt>:maxsize</tt>] Maximum size of the file in bytes.
14
+ # [<tt>:trunc</tt>] Maximum age of the file in seconds.
15
+ class RollingFileOutputter < FileOutputter
16
+
17
+ attr_reader :count, :maxsize, :maxtime, :startTime#,i:baseFilename
18
+
19
+ def initialize(_name, hash={})
20
+ @count = 0
21
+ super(_name, hash)
22
+ if hash.has_key?(:maxsize) || hash.has_key?('maxsize')
23
+ _maxsize = (hash[:maxsize] or hash['maxsize']).to_i
24
+ if _maxsize.class != Fixnum
25
+ raise TypeError, "Argument 'maxsize' must be an Fixnum", caller
26
+ end
27
+ if _maxsize == 0
28
+ raise TypeError, "Argument 'maxsize' must be > 0", caller
29
+ end
30
+ @maxsize = _maxsize
31
+ end
32
+ if hash.has_key?(:maxtime) || hash.has_key?('maxtime')
33
+ _maxtime = (hash[:maxtime] or hash['maxtime']).to_i
34
+ if _maxtime.class != Fixnum
35
+ raise TypeError, "Argument 'maxtime' must be an Fixnum", caller
36
+ end
37
+ if _maxtime == 0
38
+ raise TypeError, "Argument 'maxtime' must be > 0", caller
39
+ end
40
+ @maxtime = _maxtime
41
+ @startTime = Time.now
42
+ end
43
+ @baseFilename = File.basename(@filename)
44
+ # roll immediately so all files are of the form "000001-@baseFilename"
45
+ roll
46
+ # initialize the file size counter
47
+ @datasize = 0
48
+ end
49
+
50
+ #######
51
+ private
52
+ #######
53
+
54
+ # perform the write
55
+ def write(data)
56
+ # we have to keep track of the file size ourselves - File.size doesn't
57
+ # seem to report the correct size when the size changes rapidly
58
+ @datasize += data.size + 1 # the 1 is for newline
59
+ super
60
+ roll if requiresRoll
61
+ end
62
+
63
+ # construct a new filename from the count and baseFilname
64
+ def makeNewFilename
65
+ # note use of hard coded 6 digit counter width - is this enough files?
66
+ pad = "0" * (6 - @count.to_s.length) + count.to_s
67
+ newbase = @baseFilename.sub(/(\.\w*)$/, pad + '\1')
68
+ @filename = File.join(File.dirname(@filename), newbase)
69
+ Logger.log_internal {"File #{@filename} created"}
70
+ end
71
+
72
+ # does the file require a roll?
73
+ def requiresRoll
74
+ if !@maxsize.nil? && @datasize > @maxsize
75
+ @datasize = 0
76
+ return true
77
+ end
78
+ if !@maxtime.nil? && (Time.now - @startTime) > @maxtime
79
+ @startTime = Time.now
80
+ return true
81
+ end
82
+ false
83
+ end
84
+
85
+ # roll the file
86
+ def roll
87
+ begin
88
+ @out.close
89
+ rescue
90
+ Logger.log_internal {
91
+ "RollingFileOutputter '#{@name}' could not close #{@filename}"
92
+ }
93
+ end
94
+ @count += 1
95
+ makeNewFilename
96
+ @out = File.new(@filename, (@trunc ? "w" : "a"))
97
+ end
98
+
99
+ end
100
+
101
+ end
102
+
103
+ # this can be found in examples/fileroll.rb as well
104
+ if __FILE__ == $0
105
+ require 'log4r'
106
+ include Log4r
107
+
108
+
109
+ timeLog = Logger.new 'WbExplorer'
110
+ timeLog.outputters = RollingFileOutputter.new("WbExplorer", { "filename" => "TestTime.log", "maxtime" => 10, "trunc" => true })
111
+ timeLog.level = DEBUG
112
+
113
+ 100.times { |t|
114
+ timeLog.info "blah #{t}"
115
+ sleep(1.0)
116
+ }
117
+
118
+ sizeLog = Logger.new 'WbExplorer'
119
+ sizeLog.outputters = RollingFileOutputter.new("WbExplorer", { "filename" => "TestSize.log", "maxsize" => 16000, "trunc" => true })
120
+ sizeLog.level = DEBUG
121
+
122
+ 10000.times { |t|
123
+ sizeLog.info "blah #{t}"
124
+ }
125
+
126
+ end
@@ -0,0 +1,30 @@
1
+ # :nodoc:
2
+ module Log4r
3
+
4
+ class Outputter
5
+ # Retrieve an outputter.
6
+ def self.[](name)
7
+ out = @@outputters[name]
8
+ if out.nil?
9
+ return case name
10
+ when 'stdout' then StdoutOutputter.new 'stdout'
11
+ when 'stderr' then StderrOutputter.new 'stderr'
12
+ else nil end
13
+ end
14
+ out
15
+ end
16
+ def self.stdout; Outputter['stdout'] end
17
+ def self.stderr; Outputter['stderr'] end
18
+ # Set an outputter.
19
+ def self.[]=(name, outputter)
20
+ @@outputters[name] = outputter
21
+ end
22
+ # Yields each outputter's name and reference.
23
+ def self.each
24
+ @@outputters.each {|name, outputter| yield name, outputter}
25
+ end
26
+ def self.each_outputter
27
+ @@outputters.each_value {|outputter| yield outputter}
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,75 @@
1
+ # :include: ../rdoc/syslogoutputter
2
+ #
3
+ # Version:: $Id: syslogoutputter.rb,v 1.5 2004/03/17 20:18:00 fando Exp $
4
+ # Author:: Steve Lumos
5
+ # Author:: Leon Torres
6
+
7
+ require 'log4r/formatter/formatter'
8
+ require 'log4r/outputter/outputter'
9
+ require 'log4r/configurator'
10
+ require 'syslog'
11
+
12
+ module Log4r
13
+
14
+ # syslog needs to set the custom levels
15
+ if LNAMES.size > 1
16
+ raise LoadError, "Must let syslogger.rb define custom levels"
17
+ end
18
+ # tune log4r to syslog priorities
19
+ Configurator.custom_levels("DEBUG", "INFO", "NOTICE", "WARNING", "ERR", "CRIT", "ALERT", "EMERG")
20
+
21
+ class SyslogOutputter < Outputter
22
+ include Syslog::Constants
23
+
24
+ # maps log4r levels to syslog priorities (logevents never see ALL and OFF)
25
+ SYSLOG_LEVELS = [
26
+ nil,
27
+ LOG_DEBUG,
28
+ LOG_INFO,
29
+ LOG_WARNING,
30
+ LOG_ERR,
31
+ LOG_CRIT,
32
+ nil
33
+ ]
34
+
35
+ # There are 3 hash arguments
36
+ #
37
+ # [<tt>:ident</tt>] syslog ident, defaults to _name
38
+ # [<tt>:logopt</tt>] syslog logopt, defaults to LOG_PID | LOG_CONS
39
+ # [<tt>:facility</tt>] syslog facility, defaults to LOG_USER
40
+ def initialize(_name, hash={})
41
+ super(_name, hash)
42
+ ident = (hash[:ident] or hash['ident'] or _name)
43
+ logopt = (hash[:logopt] or hash['logopt'] or LOG_PID | LOG_CONS).to_i
44
+ facility = (hash[:facility] or hash['facility'] or LOG_USER).to_i
45
+ @syslog = Syslog.open(ident, logopt, facility)
46
+ end
47
+
48
+ def closed?
49
+ return !@syslog.opened?
50
+ end
51
+
52
+ def close
53
+ @syslog.close unless @syslog.nil?
54
+ @level = OFF
55
+ OutputterFactory.create_methods(self)
56
+ Logger.log_internal {"Outputter '#{@name}' closed Syslog and set to OFF"}
57
+ end
58
+
59
+ private
60
+
61
+ def canonical_log(logevent)
62
+ pri = SYSLOG_LEVELS[logevent.level]
63
+ o = logevent.data
64
+ if o.kind_of? Exception then
65
+ msg = "#{o.class} at (#{o.backtrace[0]}): #{o.message}"
66
+ elsif o.respond_to? :to_str then
67
+ msg = o.to_str
68
+ else
69
+ msg = o.inspect
70
+ end
71
+
72
+ @syslog.log(pri, '%s', msg)
73
+ end
74
+ end
75
+ end