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.
- data/doc/content/contact.html +22 -0
 - data/doc/content/contribute.html +21 -0
 - data/doc/content/index.html +90 -0
 - data/doc/content/license.html +56 -0
 - data/doc/content/manual.html +449 -0
 - data/doc/dev/README.developers +40 -0
 - data/doc/dev/checklist +14 -0
 - data/doc/dev/things-to-do +2 -0
 - data/doc/images/crush/logo2.png +0 -0
 - data/doc/images/log4r-logo.png +0 -0
 - data/doc/images/logo2.png +0 -0
 - data/doc/log4r.css +111 -0
 - data/doc/old/manual.html +348 -0
 - data/doc/templates/main.html +147 -0
 - data/examples/README +19 -0
 - data/examples/customlevels.rb +34 -0
 - data/examples/fileroll.rb +40 -0
 - data/examples/log4r_yaml.yaml +0 -0
 - data/examples/logclient.rb +25 -0
 - data/examples/logserver.rb +18 -0
 - data/examples/moderate.xml +29 -0
 - data/examples/moderateconfig.rb +66 -0
 - data/examples/myformatter.rb +23 -0
 - data/examples/outofthebox.rb +21 -0
 - data/examples/rrconfig.xml +63 -0
 - data/examples/rrsetup.rb +42 -0
 - data/examples/simpleconfig.rb +39 -0
 - data/examples/xmlconfig.rb +25 -0
 - data/examples/yaml.rb +30 -0
 - data/src/log4r.rb +17 -0
 - data/src/log4r/base.rb +74 -0
 - data/src/log4r/config.rb +9 -0
 - data/src/log4r/configurator.rb +224 -0
 - data/src/log4r/formatter/formatter.rb +105 -0
 - data/src/log4r/formatter/patternformatter.rb +108 -0
 - data/src/log4r/lib/drbloader.rb +52 -0
 - data/src/log4r/lib/xmlloader.rb +24 -0
 - data/src/log4r/logevent.rb +28 -0
 - data/src/log4r/logger.rb +194 -0
 - data/src/log4r/loggerfactory.rb +89 -0
 - data/src/log4r/logserver.rb +28 -0
 - data/src/log4r/outputter/consoleoutputters.rb +18 -0
 - data/src/log4r/outputter/datefileoutputter.rb +110 -0
 - data/src/log4r/outputter/emailoutputter.rb +115 -0
 - data/src/log4r/outputter/fileoutputter.rb +49 -0
 - data/src/log4r/outputter/iooutputter.rb +55 -0
 - data/src/log4r/outputter/outputter.rb +132 -0
 - data/src/log4r/outputter/outputterfactory.rb +59 -0
 - data/src/log4r/outputter/remoteoutputter.rb +40 -0
 - data/src/log4r/outputter/rollingfileoutputter.rb +126 -0
 - data/src/log4r/outputter/staticoutputter.rb +30 -0
 - data/src/log4r/outputter/syslogoutputter.rb +75 -0
 - data/src/log4r/rdoc/configurator +243 -0
 - data/src/log4r/rdoc/emailoutputter +103 -0
 - data/src/log4r/rdoc/formatter +39 -0
 - data/src/log4r/rdoc/log4r +89 -0
 - data/src/log4r/rdoc/logger +175 -0
 - data/src/log4r/rdoc/logserver +85 -0
 - data/src/log4r/rdoc/outputter +108 -0
 - data/src/log4r/rdoc/patternformatter +128 -0
 - data/src/log4r/rdoc/syslogoutputter +29 -0
 - data/src/log4r/rdoc/yamlconfigurator +20 -0
 - data/src/log4r/repository.rb +65 -0
 - data/src/log4r/staticlogger.rb +49 -0
 - data/src/log4r/yamlconfigurator.rb +0 -0
 - data/tests/include.rb +7 -0
 - data/tests/runtest.rb +6 -0
 - data/tests/testbase.rb +45 -0
 - data/tests/testcustom.rb +33 -0
 - data/tests/testdefault.rb +25 -0
 - data/tests/testformatter.rb +29 -0
 - data/tests/testlogger.rb +198 -0
 - data/tests/testoutputter.rb +112 -0
 - data/tests/testpatternformatter.rb +26 -0
 - data/tests/testxmlconf.rb +51 -0
 - data/tests/xml/testconf.xml +37 -0
 - 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
         
     |