sml-log4r 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
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