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
 
    
        data/examples/rrsetup.rb
    ADDED
    
    | 
         @@ -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
         
     | 
    
        data/examples/yaml.rb
    ADDED
    
    | 
         @@ -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'])
         
     | 
    
        data/src/log4r.rb
    ADDED
    
    | 
         @@ -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
         
     | 
    
        data/src/log4r/base.rb
    ADDED
    
    | 
         @@ -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
         
     | 
    
        data/src/log4r/config.rb
    ADDED
    
    
| 
         @@ -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
         
     |