A hierarchical logging class for the Arrow framework. It provides a generalized means of logging from inside Arrow classes, and then selectively outputting/formatting log messages from points within the hierarchy.
A lot of concepts in this class were stolen from Log4r, though it‘s all original code, and works a bit differently.
require 'arrow/object' require 'arrow/logger' logger = Arrow::Logger.global logfile = File.open( "global.log", "a" ) logger.outputters << Arrow::Logger::Outputter.new(logfile) logger.level = :debug class MyClass < Arrow::Object def self::fooMethod Arrow::Logger.debug( "In server start routine" ) Arrow::Logger.info( "Server is not yet configured." ) Arrow::Logger.notice( "Server is starting up." ) end def initialize self.log.info( "Initializing another MyClass object." ) end end
$Id: logger.rb 439 2008-04-10 23:27:34Z deveiant $
Copyright © 2003-2008 The FaerieMUD Consortium.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of FaerieMUD nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Return the Arrow::Logger for the given module mod, which can be a Module object, a Symbol, or a String.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 156 156: def self::[]( mod=nil ) 157: modname = mod.to_s 158: return self.global if modname.empty? 159: 160: names = modname.split( /::/ ) 161: 162: # Create the global logger if it isn't already created 163: self.global 164: 165: names.inject( @global_logger ) {|logger,key| logger[key]} 166: end
Configure logging from the ‘logging’ section of the config.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 96 96: def self::configure( config, dispatcher ) 97: 98: self.reset 99: apacheoutputter = Arrow::Logger::Outputter.create( 'apache' ) 100: 101: config.each do |klass, setting| 102: level, uri = self.parse_log_setting( setting ) 103: 104: # Use the Apache log as the outputter if none is configured 105: if uri.nil? 106: outputter = apacheoutputter 107: else 108: outputter = Arrow::Logger::Outputter.create( uri ) 109: end 110: 111: # The 'global' entry configured the global logger 112: if klass == :global 113: self.global.level = level 114: self.global.outputters << outputter 115: next 116: end 117: 118: # If the class bit is something like 'applet', then transform 119: # it into 'Arrow::Applet' 120: if klass.to_s.match( /^[a-z][a-zA-Z]+$/ ) 121: realclass = "Arrow::%s" % klass.to_s.sub(/^([a-z])/){ $1.upcase } 122: else 123: realclass = klass.to_s 124: end 125: 126: Arrow::Logger[ realclass ].level = level 127: Arrow::Logger[ realclass ].outputters << outputter 128: end 129: 130: end
Autoload global logging methods for the log levels
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 186 186: def self::method_missing( sym, *args ) 187: return super unless LEVELS.key?( sym ) 188: 189: self.global.debug( "Autoloading class log method '#{sym}'." ) 190: (class << self; self; end).class_eval do 191: define_method( sym ) do |*args| 192: self.global.send( sym, *args ) 193: end 194: end 195: 196: self.global.send( sym, *args ) 197: end
Create and return a new Arrow::Logger object with the given name at the specified level, with the specified superlogger. Any outputters that are specified will be added.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 207 207: def initialize( name, level=:info, superlogger=nil, *outputters ) 208: if name.empty? 209: # debug_msg "Creating global logger" 210: else 211: # debug_msg "Creating logger for #{name}" 212: end 213: 214: @name = name 215: @outputters = outputters 216: @subloggers = {} 217: @superlogger = superlogger 218: @trace = false 219: @level = nil 220: 221: self.level = level 222: end
Parse the configuration for a given class‘s logger. The configuration is in the form:
<level> [<outputter_uri>]
where level is one of the logging levels defined by this class (see the LEVELS constant), and the optional outputter_uri indicates which outputter to use, and how it should be configured. See Arrow::Logger::Outputter for more info.
Examples:
notice debug file:///tmp/broker-debug.log error dbi://www:password@localhost/www.errorlog?driver=postgresql
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 146 146: def self::parse_log_setting( setting ) 147: level, rawuri = setting.split( ' ', 2 ) 148: uri = rawuri.nil? ? nil : URI.parse( rawuri ) 149: 150: return level.to_sym, uri 151: end
Append the given obj to the logger at +:debug+ level. This is for compatibility with objects that append to $stderr for their logging (e.g., net/protocols-based libraries).
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 432 432: def <<( obj ) 433: self.write( :debug, obj ) 434: return self 435: end
Return the sublogger for the given module mod (a Module, a String, or a Symbol) under this logger. A new one will instantiated if it does not already exist.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 422 422: def []( mod ) 423: # debug_msg "creating sublogger for '#{mod}'" unless @subloggers.key?( mod.to_s ) 424: @subloggers[ mod.to_s ] ||= 425: self.class.new( @name + "::" + mod.to_s, self.level, self ) 426: end
Return a uniquified Array of the loggers which are more-generally related hierarchically to the receiver, inclusive. If called with a block, it will be called once for each Logger object. If level is specified, only those loggers whose level is level or lower will be selected.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 340 340: def hierloggers( level=LEVELS[:emerg] ) 341: loggers = [] 342: logger = self 343: lastlogger = nil 344: level = LEVELS[ level ] if level.is_a?( Symbol ) 345: 346: # debug_msg "Searching for loggers in the hierarchy above %s" % 347: # [ logger.name.empty? ? "[Global]" : logger.name ] 348: 349: # Traverse the logger hierarchy upward (more general), looking for ones 350: # whose level is below the argument. 351: begin 352: lastlogger = logger 353: next unless logger.level <= level 354: 355: # When one is found, add it to the ones being returned and yield it 356: # if there's a block 357: # debug_msg "hierloggers: added %s" % logger.readable_name 358: loggers.push( logger ) 359: yield( logger ) if block_given? 360: 361: end while (( logger = lastlogger.superlogger )) 362: 363: return loggers 364: end
Return a uniquified Array of all outputters for this logger and all of the loggers above it in the logging hierarchy. If called with a block, it will be called once for each outputter and the first logger to which it is attached.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 371 371: def hieroutputters( level=LEVELS[:emerg] ) 372: outputters = [] 373: 374: # Look for loggers which are higher in the hierarchy 375: self.hierloggers( level ) do |logger| 376: outpary = logger.outputters || [] 377: newoutpary = outpary - (outpary & outputters) 378: 379: # If there are any outputters which haven't already been seen, 380: # output to them. 381: unless newoutpary.empty? 382: # debug_msg "hieroutputters: adding: %s" % 383: # newoutpary.collect {|outp| outp.description}.join(", ") 384: if block_given? 385: newoutpary.each {|outputter| yield(outputter, logger)} 386: end 387: outputters += newoutpary 388: end 389: end 390: 391: return outputters 392: end
Return a human-readable string representation of the object.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 249 249: def inspect 250: "#<%s:0x%0x %s [level: %s, outputters: %d, trace: %s]>" % [ 251: self.class.name, 252: self.object_id * 2, 253: self.readable_name, 254: self.readable_level, 255: self.outputters.length, 256: self.trace ? "on" : "off", 257: ] 258: end
Return a (more-detailed) human-readable string representation of the object.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 262 262: def inspect_details( level=0 ) 263: indent = ' ' * (level + 1) 264: 265: prelude = "<< %s [level: %s, trace: %s] >>" % [ 266: self.readable_name, 267: self.readable_level, 268: self.trace ? "on" : "off", 269: ] 270: 271: details = [] 272: 273: unless self.outputters.empty? 274: details << "Outputters:" << self.outputters.map {|op| op.inspect } 275: end 276: 277: unless self.subloggers.empty? 278: details << "Subloggers:" << 279: self.subloggers.values.map {|sl| sl.inspect_details(level + 1) } 280: end 281: 282: details = details.flatten.compact.map {|line| indent + line } 283: 284: if level.zero? 285: return [ prelude, *details ].join( "\n" ) 286: else 287: return [ prelude, *details ] 288: end 289: end
Set the level of this logger to level. The level can be a String, a Symbol, or an Integer.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 309 309: def level=( level ) 310: # debug_msg ">>> Setting log level for %s to %p" % 311: # [ self.name.empty? ? "[Global]" : self.name, level ] 312: 313: case level 314: when String 315: @level = LEVELS[ level.intern ] 316: when Symbol 317: @level = LEVELS[ level ] 318: when Integer 319: @level = level 320: else 321: @level = nil 322: end 323: 324: # If the level wasn't set correctly, raise an error after setting 325: # the level to something reasonable. 326: if @level.nil? 327: @level = LEVELS[ :notice ] 328: raise ArgumentError, "Illegal log level specification: %p for %s" % 329: [ level, self.name ] 330: end 331: end
Return the logger‘s level as a Symbol.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 302 302: def readable_level 303: return LEVEL_NAMES[ @level ] 304: end
Return the name of the logger formatted to be suitable for reading.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 293 293: def readable_name 294: logname = self.name.sub( /^::/, '' ) 295: logname = '(global)' if logname.empty? 296: 297: return logname 298: end
Write the given args to any connected outputters if level is less than or equal to this logger‘s level.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 397 397: def write( level, *args ) 398: debug_msg "Writing message at %p: %p" % [ level, args ] 399: 400: msg, frame = nil, nil 401: time = Time.now 402: 403: # If tracing is turned on, pick the first frame in the stack that 404: # isn't in this file, or the last one if that fails to yield one. 405: if @trace 406: frame = caller(1).find {|fr| fr !~ %r{arrow/logger\.rb} } || 407: caller(1).last 408: end 409: 410: # Find the outputters that need to be written to, then write to them. 411: self.hieroutputters( level ) do |outp, logger| 412: debug_msg "Got outputter %p" % outp 413: msg ||= args.collect {|obj| self.stringify_object(obj)}.join 414: outp.write( time, level, self.readable_name, frame, msg ) 415: end 416: end
Return a Proc suitable for installing as a predicate method for the given logging level.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 481 481: def make_level_predicate_method( level ) 482: numeric_level = LEVELS[level] 483: Proc.new { self.level < numeric_level } 484: end
Return a Proc suitable for installing as a log-writing method for the given logging level.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 489 489: def make_writer_method( level ) 490: Proc.new {|*args| self.write(level, *args)} 491: end
Auto-install logging methods (ie., methods whose names match one of Arrow::Logger::LEVELS.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 457 457: def method_missing( sym, *args ) 458: name = sym.to_s 459: level = name[/\w+/].to_sym 460: return super unless Arrow::Logger::LEVELS.member?( level ) 461: code = nil 462: 463: case name 464: when /^\w+\?/ 465: code = self.make_level_predicate_method( level ) 466: 467: when /^\w+$/ 468: code = self.make_writer_method( level ) 469: 470: else 471: return super 472: end 473: 474: self.class.send( :define_method, sym, &code ) 475: return self.method( sym ).call( *args ) 476: end
Dump the given object for output in the log.
# File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 443 443: def stringify_object( obj ) 444: return case obj 445: when Exception 446: "%s:\n %s" % [ obj.message, obj.backtrace.join("\n ") ] 447: when String 448: obj 449: else 450: obj.inspect 451: end 452: end
--- SEC00074
--- ""
--- - name: level rw: R a_desc: |+ The integer level of the logger. - name: name rw: R a_desc: |+ The name of this logger - name: outputters rw: RW a_desc: |+ The outputters attached to this branch of the logger tree. - name: subloggers rw: RW a_desc: |+ The branches of the logging hierarchy that fall below this one. - name: superlogger rw: R a_desc: |+ The logger object that is this logger‘s parent (if any). - name: trace rw: RW a_desc: |+ Set to a true value to turn tracing on
--- - methods: - visibility: public aref: M000594 name: "[]" sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 156</span>\n\ 156: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-operator\">[]</span>( <span class=\"ruby-identifier\">mod</span>=<span class=\"ruby-keyword kw\">nil</span> )\n\ 157: <span class=\"ruby-identifier\">modname</span> = <span class=\"ruby-identifier\">mod</span>.<span class=\"ruby-identifier\">to_s</span>\n\ 158: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">global</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">modname</span>.<span class=\"ruby-identifier\">empty?</span>\n\ 159: \n\ 160: <span class=\"ruby-identifier\">names</span> = <span class=\"ruby-identifier\">modname</span>.<span class=\"ruby-identifier\">split</span>( <span class=\"ruby-regexp re\">/::/</span> )\n\ 161: \n\ 162: <span class=\"ruby-comment cmt\"># Create the global logger if it isn't already created</span>\n\ 163: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">global</span>\n\ 164: \n\ 165: <span class=\"ruby-identifier\">names</span>.<span class=\"ruby-identifier\">inject</span>( <span class=\"ruby-ivar\">@global_logger</span> ) {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">logger</span>,<span class=\"ruby-identifier\">key</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">logger</span>[<span class=\"ruby-identifier\">key</span>]}\n\ 166: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return the <a href="Logger.html">Arrow::Logger</a> for the given module <tt>mod</tt>, which can be a <a href="../Module.html">Module</a> object, a Symbol, or a String. </p> params: ( mod=nil ) - visibility: public aref: M000592 name: configure sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 96</span>\n 96: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">configure</span>( <span class=\"ruby-identifier\">config</span>, <span class=\"ruby-identifier\">dispatcher</span> )\n 97: \n 98: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">reset</span>\n 99: <span class=\"ruby-identifier\">apacheoutputter</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Outputter</span>.<span class=\"ruby-identifier\">create</span>( <span class=\"ruby-value str\">'apache'</span> )\n\ 100: \n\ 101: <span class=\"ruby-identifier\">config</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">klass</span>, <span class=\"ruby-identifier\">setting</span><span class=\"ruby-operator\">|</span>\n\ 102: <span class=\"ruby-identifier\">level</span>, <span class=\"ruby-identifier\">uri</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">parse_log_setting</span>( <span class=\"ruby-identifier\">setting</span> )\n\ 103: \n\ 104: <span class=\"ruby-comment cmt\"># Use the Apache log as the outputter if none is configured</span>\n\ 105: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">uri</span>.<span class=\"ruby-identifier\">nil?</span>\n\ 106: <span class=\"ruby-identifier\">outputter</span> = <span class=\"ruby-identifier\">apacheoutputter</span>\n\ 107: <span class=\"ruby-keyword kw\">else</span>\n\ 108: <span class=\"ruby-identifier\">outputter</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Outputter</span>.<span class=\"ruby-identifier\">create</span>( <span class=\"ruby-identifier\">uri</span> )\n\ 109: <span class=\"ruby-keyword kw\">end</span>\n\ 110: \n\ 111: <span class=\"ruby-comment cmt\"># The 'global' entry configured the global logger</span>\n\ 112: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">klass</span> <span class=\"ruby-operator\">==</span> <span class=\"ruby-identifier\">:global</span>\n\ 113: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">global</span>.<span class=\"ruby-identifier\">level</span> = <span class=\"ruby-identifier\">level</span>\n\ 114: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">global</span>.<span class=\"ruby-identifier\">outputters</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-identifier\">outputter</span>\n\ 115: <span class=\"ruby-keyword kw\">next</span>\n\ 116: <span class=\"ruby-keyword kw\">end</span>\n\ 117: \n\ 118: <span class=\"ruby-comment cmt\"># If the class bit is something like 'applet', then transform</span>\n\ 119: <span class=\"ruby-comment cmt\"># it into 'Arrow::Applet'</span>\n\ 120: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">klass</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">match</span>( <span class=\"ruby-regexp re\">/^[a-z][a-zA-Z]+$/</span> )\n\ 121: <span class=\"ruby-identifier\">realclass</span> = <span class=\"ruby-value str\">"Arrow::%s"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">klass</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">sub</span>(<span class=\"ruby-regexp re\">/^([a-z])/</span>){ <span class=\"ruby-identifier\">$1</span>.<span class=\"ruby-identifier\">upcase</span> }\n\ 122: <span class=\"ruby-keyword kw\">else</span>\n\ 123: <span class=\"ruby-identifier\">realclass</span> = <span class=\"ruby-identifier\">klass</span>.<span class=\"ruby-identifier\">to_s</span>\n\ 124: <span class=\"ruby-keyword kw\">end</span>\n\ 125: \n\ 126: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span>[ <span class=\"ruby-identifier\">realclass</span> ].<span class=\"ruby-identifier\">level</span> = <span class=\"ruby-identifier\">level</span>\n\ 127: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span>[ <span class=\"ruby-identifier\">realclass</span> ].<span class=\"ruby-identifier\">outputters</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-identifier\">outputter</span>\n\ 128: <span class=\"ruby-keyword kw\">end</span>\n\ 129: \n\ 130: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Configure logging from the ‘logging’ section of the config. </p> params: ( config, dispatcher ) - visibility: public aref: M000595 name: global sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 171</span>\n\ 171: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">global</span>\n\ 172: <span class=\"ruby-comment cmt\"># debug_msg "Creating the global logger" unless @global_logger</span>\n\ 173: <span class=\"ruby-ivar\">@global_logger</span> <span class=\"ruby-operator\">||=</span> <span class=\"ruby-identifier\">new</span>( <span class=\"ruby-value str\">''</span> )\n\ 174: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return the <a href="Logger.html#M000595">global</a> <a href="../Arrow.html">Arrow</a> logger, setting it up if it hasn‘t been already. </p> params: () - visibility: public aref: M000597 name: method_missing sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 186</span>\n\ 186: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">method_missing</span>( <span class=\"ruby-identifier\">sym</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 187: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">super</span> <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-constant\">LEVELS</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">sym</span> )\n\ 188: \n\ 189: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">global</span>.<span class=\"ruby-identifier\">debug</span>( <span class=\"ruby-node\">"Autoloading class log method '#{sym}'."</span> )\n\ 190: (<span class=\"ruby-keyword kw\">class</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-keyword kw\">self</span>; <span class=\"ruby-keyword kw\">self</span>; <span class=\"ruby-keyword kw\">end</span>).<span class=\"ruby-identifier\">class_eval</span> <span class=\"ruby-keyword kw\">do</span>\n\ 191: <span class=\"ruby-identifier\">define_method</span>( <span class=\"ruby-identifier\">sym</span> ) <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span><span class=\"ruby-operator\">|</span>\n\ 192: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">global</span>.<span class=\"ruby-identifier\">send</span>( <span class=\"ruby-identifier\">sym</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 193: <span class=\"ruby-keyword kw\">end</span>\n\ 194: <span class=\"ruby-keyword kw\">end</span>\n\ 195: \n\ 196: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">global</span>.<span class=\"ruby-identifier\">send</span>( <span class=\"ruby-identifier\">sym</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 197: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Autoload <a href="Logger.html#M000595">global</a> logging methods for the log levels </p> params: ( sym, *args ) - visibility: public aref: M000598 name: new sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 207</span>\n\ 207: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">level</span>=<span class=\"ruby-identifier\">:info</span>, <span class=\"ruby-identifier\">superlogger</span>=<span class=\"ruby-keyword kw\">nil</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">outputters</span> )\n\ 208: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">name</span>.<span class=\"ruby-identifier\">empty?</span>\n\ 209: <span class=\"ruby-comment cmt\"># debug_msg "Creating global logger"</span>\n\ 210: <span class=\"ruby-keyword kw\">else</span>\n\ 211: <span class=\"ruby-comment cmt\"># debug_msg "Creating logger for #{name}"</span>\n\ 212: <span class=\"ruby-keyword kw\">end</span>\n\ 213: \n\ 214: <span class=\"ruby-ivar\">@name</span> = <span class=\"ruby-identifier\">name</span>\n\ 215: <span class=\"ruby-ivar\">@outputters</span> = <span class=\"ruby-identifier\">outputters</span>\n\ 216: <span class=\"ruby-ivar\">@subloggers</span> = {}\n\ 217: <span class=\"ruby-ivar\">@superlogger</span> = <span class=\"ruby-identifier\">superlogger</span>\n\ 218: <span class=\"ruby-ivar\">@trace</span> = <span class=\"ruby-keyword kw\">false</span>\n\ 219: <span class=\"ruby-ivar\">@level</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 220: \n\ 221: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">level</span> = <span class=\"ruby-identifier\">level</span>\n\ 222: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Create and return a <a href="Logger.html#M000598">new</a> <a href="Logger.html">Arrow::Logger</a> object with the given <tt>name</tt> at the specified <tt>level</tt>, with the specified <tt>superlogger</tt>. Any <tt>outputters</tt> that are specified will be added. </p> params: ( name, level=:info, superlogger=nil, *outputters ) - visibility: public aref: M000593 name: parse_log_setting sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 146</span>\n\ 146: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">parse_log_setting</span>( <span class=\"ruby-identifier\">setting</span> )\n\ 147: <span class=\"ruby-identifier\">level</span>, <span class=\"ruby-identifier\">rawuri</span> = <span class=\"ruby-identifier\">setting</span>.<span class=\"ruby-identifier\">split</span>( <span class=\"ruby-value str\">' '</span>, <span class=\"ruby-value\">2</span> )\n\ 148: <span class=\"ruby-identifier\">uri</span> = <span class=\"ruby-identifier\">rawuri</span>.<span class=\"ruby-identifier\">nil?</span> <span class=\"ruby-value\">? </span><span class=\"ruby-keyword kw\">nil</span> <span class=\"ruby-operator\">:</span> <span class=\"ruby-constant\">URI</span>.<span class=\"ruby-identifier\">parse</span>( <span class=\"ruby-identifier\">rawuri</span> )\n\ 149: \n\ 150: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">level</span>.<span class=\"ruby-identifier\">to_sym</span>, <span class=\"ruby-identifier\">uri</span>\n\ 151: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Parse the configuration for a given class‘s logger. The configuration is in the form: </p> <pre> <level> [<outputter_uri>] </pre> <p> where <tt>level</tt> is one of the logging levels defined by this class (see the LEVELS constant), and the optional <tt>outputter_uri</tt> indicates which outputter to use, and how it should be configured. See <a href="Logger/Outputter.html">Arrow::Logger::Outputter</a> for more info. </p> <p> Examples: </p> <pre> notice debug file:///tmp/broker-debug.log error dbi://www:password@localhost/www.errorlog?driver=postgresql </pre> params: ( setting ) - visibility: public aref: M000596 name: reset sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 179</span>\n\ 179: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">reset</span>\n\ 180: <span class=\"ruby-comment cmt\"># debug_msg "Resetting the global logger"</span>\n\ 181: <span class=\"ruby-ivar\">@global_logger</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 182: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Reset the logging subsystem. Clears out any registered loggers and their associated outputters. </p> params: () category: Class type: Public - methods: - visibility: public aref: M000608 name: "<<" sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 432</span>\n\ 432: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-operator\"><<</span>( <span class=\"ruby-identifier\">obj</span> )\n\ 433: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">write</span>( <span class=\"ruby-identifier\">:debug</span>, <span class=\"ruby-identifier\">obj</span> )\n\ 434: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">self</span>\n\ 435: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Append the given <tt>obj</tt> to the logger at +:debug+ level. This is for compatibility with objects that append to $stderr for their logging (e.g., net/protocols-based libraries). </p> params: ( obj ) - visibility: public aref: M000607 name: "[]" sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 422</span>\n\ 422: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-operator\">[]</span>( <span class=\"ruby-identifier\">mod</span> )\n\ 423: <span class=\"ruby-comment cmt\"># debug_msg "creating sublogger for '#{mod}'" unless @subloggers.key?( mod.to_s )</span>\n\ 424: <span class=\"ruby-ivar\">@subloggers</span>[ <span class=\"ruby-identifier\">mod</span>.<span class=\"ruby-identifier\">to_s</span> ] <span class=\"ruby-operator\">||=</span>\n\ 425: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-ivar\">@name</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-value str\">"::"</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-identifier\">mod</span>.<span class=\"ruby-identifier\">to_s</span>, <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">level</span>, <span class=\"ruby-keyword kw\">self</span> )\n\ 426: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return the sublogger for the given module <tt>mod</tt> (a <a href="../Module.html">Module</a>, a String, or a Symbol) under this logger. A <a href="Logger.html#M000598">new</a> one will instantiated if it does not already exist. </p> params: ( mod ) - visibility: public aref: M000604 name: hierloggers sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 340</span>\n\ 340: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">hierloggers</span>( <span class=\"ruby-identifier\">level</span>=<span class=\"ruby-constant\">LEVELS</span>[<span class=\"ruby-identifier\">:emerg</span>] )\n\ 341: <span class=\"ruby-identifier\">loggers</span> = []\n\ 342: <span class=\"ruby-identifier\">logger</span> = <span class=\"ruby-keyword kw\">self</span>\n\ 343: <span class=\"ruby-identifier\">lastlogger</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 344: <span class=\"ruby-identifier\">level</span> = <span class=\"ruby-constant\">LEVELS</span>[ <span class=\"ruby-identifier\">level</span> ] <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">level</span>.<span class=\"ruby-identifier\">is_a?</span>( <span class=\"ruby-constant\">Symbol</span> )\n\ 345: \n\ 346: <span class=\"ruby-comment cmt\"># debug_msg "Searching for loggers in the hierarchy above %s" % </span>\n\ 347: <span class=\"ruby-comment cmt\"># [ logger.name.empty? ? "[Global]" : logger.name ]</span>\n\ 348: \n\ 349: <span class=\"ruby-comment cmt\"># Traverse the logger hierarchy upward (more general), looking for ones</span>\n\ 350: <span class=\"ruby-comment cmt\"># whose level is below the argument.</span>\n\ 351: <span class=\"ruby-keyword kw\">begin</span>\n\ 352: <span class=\"ruby-identifier\">lastlogger</span> = <span class=\"ruby-identifier\">logger</span>\n\ 353: <span class=\"ruby-keyword kw\">next</span> <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-identifier\">logger</span>.<span class=\"ruby-identifier\">level</span> <span class=\"ruby-operator\"><=</span> <span class=\"ruby-identifier\">level</span>\n\ 354: \n\ 355: <span class=\"ruby-comment cmt\"># When one is found, add it to the ones being returned and yield it</span>\n\ 356: <span class=\"ruby-comment cmt\"># if there's a block</span>\n\ 357: <span class=\"ruby-comment cmt\"># debug_msg "hierloggers: added %s" % logger.readable_name</span>\n\ 358: <span class=\"ruby-identifier\">loggers</span>.<span class=\"ruby-identifier\">push</span>( <span class=\"ruby-identifier\">logger</span> )\n\ 359: <span class=\"ruby-keyword kw\">yield</span>( <span class=\"ruby-identifier\">logger</span> ) <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">block_given?</span>\n\ 360: \n\ 361: <span class=\"ruby-keyword kw\">end</span> <span class=\"ruby-keyword kw\">while</span> (( <span class=\"ruby-identifier\">logger</span> = <span class=\"ruby-identifier\">lastlogger</span>.<span class=\"ruby-identifier\">superlogger</span> ))\n\ 362: \n\ 363: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">loggers</span>\n\ 364: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return a uniquified Array of the loggers which are more-generally related hierarchically to the receiver, inclusive. If called with a block, it will be called once for each <a href="Logger.html">Logger</a> object. If <tt>level</tt> is specified, only those loggers whose level is <tt>level</tt> or lower will be selected. </p> params: ( level=LEVELS[:emerg] ) {|logger| ...} - visibility: public aref: M000605 name: hieroutputters sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 371</span>\n\ 371: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">hieroutputters</span>( <span class=\"ruby-identifier\">level</span>=<span class=\"ruby-constant\">LEVELS</span>[<span class=\"ruby-identifier\">:emerg</span>] )\n\ 372: <span class=\"ruby-identifier\">outputters</span> = []\n\ 373: \n\ 374: <span class=\"ruby-comment cmt\"># Look for loggers which are higher in the hierarchy</span>\n\ 375: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">hierloggers</span>( <span class=\"ruby-identifier\">level</span> ) <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">logger</span><span class=\"ruby-operator\">|</span>\n\ 376: <span class=\"ruby-identifier\">outpary</span> = <span class=\"ruby-identifier\">logger</span>.<span class=\"ruby-identifier\">outputters</span> <span class=\"ruby-operator\">||</span> []\n\ 377: <span class=\"ruby-identifier\">newoutpary</span> = <span class=\"ruby-identifier\">outpary</span> <span class=\"ruby-operator\">-</span> (<span class=\"ruby-identifier\">outpary</span> <span class=\"ruby-operator\">&</span> <span class=\"ruby-identifier\">outputters</span>)\n\ 378: \n\ 379: <span class=\"ruby-comment cmt\"># If there are any outputters which haven't already been seen,</span>\n\ 380: <span class=\"ruby-comment cmt\"># output to them.</span>\n\ 381: <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-identifier\">newoutpary</span>.<span class=\"ruby-identifier\">empty?</span>\n\ 382: <span class=\"ruby-comment cmt\"># debug_msg "hieroutputters: adding: %s" %</span>\n\ 383: <span class=\"ruby-comment cmt\"># newoutpary.collect {|outp| outp.description}.join(", ")</span>\n\ 384: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">block_given?</span>\n\ 385: <span class=\"ruby-identifier\">newoutpary</span>.<span class=\"ruby-identifier\">each</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">outputter</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-keyword kw\">yield</span>(<span class=\"ruby-identifier\">outputter</span>, <span class=\"ruby-identifier\">logger</span>)}\n\ 386: <span class=\"ruby-keyword kw\">end</span>\n\ 387: <span class=\"ruby-identifier\">outputters</span> <span class=\"ruby-operator\">+=</span> <span class=\"ruby-identifier\">newoutpary</span>\n\ 388: <span class=\"ruby-keyword kw\">end</span>\n\ 389: <span class=\"ruby-keyword kw\">end</span>\n\ 390: \n\ 391: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">outputters</span>\n\ 392: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return a uniquified Array of all outputters for this logger and all of the loggers above it in the logging hierarchy. If called with a block, it will be called once for each outputter and the first logger to which it is attached. </p> params: ( level=LEVELS[:emerg] ) {|outputter, logger| ...} - visibility: public aref: M000599 name: inspect sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 249</span>\n\ 249: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">inspect</span>\n\ 250: <span class=\"ruby-value str\">"#<%s:0x%0x %s [level: %s, outputters: %d, trace: %s]>"</span> <span class=\"ruby-operator\">%</span> [\n\ 251: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">name</span>,\n\ 252: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">object_id</span> <span class=\"ruby-operator\">*</span> <span class=\"ruby-value\">2</span>,\n\ 253: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">readable_name</span>,\n\ 254: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">readable_level</span>,\n\ 255: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">outputters</span>.<span class=\"ruby-identifier\">length</span>,\n\ 256: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">trace</span> <span class=\"ruby-value\">? </span><span class=\"ruby-value str\">"on"</span> <span class=\"ruby-operator\">:</span> <span class=\"ruby-value str\">"off"</span>,\n\ 257: ]\n\ 258: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return a human-readable string representation of the object. </p> params: () - visibility: public aref: M000600 name: inspect_details sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 262</span>\n\ 262: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">inspect_details</span>( <span class=\"ruby-identifier\">level</span>=<span class=\"ruby-value\">0</span> )\n\ 263: <span class=\"ruby-identifier\">indent</span> = <span class=\"ruby-value str\">' '</span> <span class=\"ruby-operator\">*</span> (<span class=\"ruby-identifier\">level</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-value\">1</span>)\n\ 264: \n\ 265: <span class=\"ruby-identifier\">prelude</span> = <span class=\"ruby-value str\">"<< %s [level: %s, trace: %s] >>"</span> <span class=\"ruby-operator\">%</span> [\n\ 266: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">readable_name</span>,\n\ 267: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">readable_level</span>,\n\ 268: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">trace</span> <span class=\"ruby-value\">? </span><span class=\"ruby-value str\">"on"</span> <span class=\"ruby-operator\">:</span> <span class=\"ruby-value str\">"off"</span>,\n\ 269: ]\n\ 270: \n\ 271: <span class=\"ruby-identifier\">details</span> = []\n\ 272: \n\ 273: <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">outputters</span>.<span class=\"ruby-identifier\">empty?</span>\n\ 274: <span class=\"ruby-identifier\">details</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-value str\">"Outputters:"</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">outputters</span>.<span class=\"ruby-identifier\">map</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">op</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">op</span>.<span class=\"ruby-identifier\">inspect</span> }\n\ 275: <span class=\"ruby-keyword kw\">end</span>\n\ 276: \n\ 277: <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">subloggers</span>.<span class=\"ruby-identifier\">empty?</span>\n\ 278: <span class=\"ruby-identifier\">details</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-value str\">"Subloggers:"</span> <span class=\"ruby-operator\"><<</span> \n\ 279: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">subloggers</span>.<span class=\"ruby-identifier\">values</span>.<span class=\"ruby-identifier\">map</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">sl</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">sl</span>.<span class=\"ruby-identifier\">inspect_details</span>(<span class=\"ruby-identifier\">level</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-value\">1</span>) }\n\ 280: <span class=\"ruby-keyword kw\">end</span>\n\ 281: \n\ 282: <span class=\"ruby-identifier\">details</span> = <span class=\"ruby-identifier\">details</span>.<span class=\"ruby-identifier\">flatten</span>.<span class=\"ruby-identifier\">compact</span>.<span class=\"ruby-identifier\">map</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">line</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">indent</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-identifier\">line</span> }\n\ 283: \n\ 284: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">level</span>.<span class=\"ruby-identifier\">zero?</span>\n\ 285: <span class=\"ruby-keyword kw\">return</span> [ <span class=\"ruby-identifier\">prelude</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">details</span> ].<span class=\"ruby-identifier\">join</span>( <span class=\"ruby-value str\">"\\n"</span> )\n\ 286: <span class=\"ruby-keyword kw\">else</span>\n\ 287: <span class=\"ruby-keyword kw\">return</span> [ <span class=\"ruby-identifier\">prelude</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">details</span> ]\n\ 288: <span class=\"ruby-keyword kw\">end</span>\n\ 289: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return a (more-detailed) human-readable string representation of the object. </p> params: ( level=0 ) - visibility: public aref: M000603 name: level= sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 309</span>\n\ 309: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">level=</span>( <span class=\"ruby-identifier\">level</span> )\n\ 310: <span class=\"ruby-comment cmt\"># debug_msg ">>> Setting log level for %s to %p" %</span>\n\ 311: <span class=\"ruby-comment cmt\"># [ self.name.empty? ? "[Global]" : self.name, level ]</span>\n\ 312: \n\ 313: <span class=\"ruby-keyword kw\">case</span> <span class=\"ruby-identifier\">level</span>\n\ 314: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">String</span>\n\ 315: <span class=\"ruby-ivar\">@level</span> = <span class=\"ruby-constant\">LEVELS</span>[ <span class=\"ruby-identifier\">level</span>.<span class=\"ruby-identifier\">intern</span> ]\n\ 316: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Symbol</span>\n\ 317: <span class=\"ruby-ivar\">@level</span> = <span class=\"ruby-constant\">LEVELS</span>[ <span class=\"ruby-identifier\">level</span> ]\n\ 318: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Integer</span>\n\ 319: <span class=\"ruby-ivar\">@level</span> = <span class=\"ruby-identifier\">level</span>\n\ 320: <span class=\"ruby-keyword kw\">else</span>\n\ 321: <span class=\"ruby-ivar\">@level</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 322: <span class=\"ruby-keyword kw\">end</span>\n\ 323: \n\ 324: <span class=\"ruby-comment cmt\"># If the level wasn't set correctly, raise an error after setting</span>\n\ 325: <span class=\"ruby-comment cmt\"># the level to something reasonable.</span>\n\ 326: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@level</span>.<span class=\"ruby-identifier\">nil?</span>\n\ 327: <span class=\"ruby-ivar\">@level</span> = <span class=\"ruby-constant\">LEVELS</span>[ <span class=\"ruby-identifier\">:notice</span> ]\n\ 328: <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">ArgumentError</span>, <span class=\"ruby-value str\">"Illegal log level specification: %p for %s"</span> <span class=\"ruby-operator\">%</span>\n\ 329: [ <span class=\"ruby-identifier\">level</span>, <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">name</span> ]\n\ 330: <span class=\"ruby-keyword kw\">end</span>\n\ 331: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Set the level of this logger to <tt>level</tt>. The <tt>level</tt> can be a String, a Symbol, or an <a href="../Integer.html">Integer</a>. </p> params: ( level ) - visibility: public aref: M000602 name: readable_level sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 302</span>\n\ 302: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">readable_level</span>\n\ 303: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-constant\">LEVEL_NAMES</span>[ <span class=\"ruby-ivar\">@level</span> ]\n\ 304: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return the logger‘s level as a Symbol. </p> params: () - visibility: public aref: M000601 name: readable_name sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 293</span>\n\ 293: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">readable_name</span>\n\ 294: <span class=\"ruby-identifier\">logname</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">name</span>.<span class=\"ruby-identifier\">sub</span>( <span class=\"ruby-regexp re\">/^::/</span>, <span class=\"ruby-value str\">''</span> )\n\ 295: <span class=\"ruby-identifier\">logname</span> = <span class=\"ruby-value str\">'(global)'</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">logname</span>.<span class=\"ruby-identifier\">empty?</span>\n\ 296: \n\ 297: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">logname</span>\n\ 298: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return the name of the logger formatted to be suitable for reading. </p> params: () - visibility: public aref: M000606 name: write sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 397</span>\n\ 397: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">write</span>( <span class=\"ruby-identifier\">level</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 398: <span class=\"ruby-identifier\">debug_msg</span> <span class=\"ruby-value str\">"Writing message at %p: %p"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">level</span>, <span class=\"ruby-identifier\">args</span> ]\n\ 399: \n\ 400: <span class=\"ruby-identifier\">msg</span>, <span class=\"ruby-identifier\">frame</span> = <span class=\"ruby-keyword kw\">nil</span>, <span class=\"ruby-keyword kw\">nil</span>\n\ 401: <span class=\"ruby-identifier\">time</span> = <span class=\"ruby-constant\">Time</span>.<span class=\"ruby-identifier\">now</span>\n\ 402: \n\ 403: <span class=\"ruby-comment cmt\"># If tracing is turned on, pick the first frame in the stack that</span>\n\ 404: <span class=\"ruby-comment cmt\"># isn't in this file, or the last one if that fails to yield one.</span>\n\ 405: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@trace</span>\n\ 406: <span class=\"ruby-identifier\">frame</span> = <span class=\"ruby-identifier\">caller</span>(<span class=\"ruby-value\">1</span>).<span class=\"ruby-identifier\">find</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">fr</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">fr</span> <span class=\"ruby-operator\">!~</span> <span class=\"ruby-regexp re\">%r{arrow/logger\\.rb}</span> } <span class=\"ruby-operator\">||</span>\n\ 407: <span class=\"ruby-identifier\">caller</span>(<span class=\"ruby-value\">1</span>).<span class=\"ruby-identifier\">last</span>\n\ 408: <span class=\"ruby-keyword kw\">end</span>\n\ 409: \n\ 410: <span class=\"ruby-comment cmt\"># Find the outputters that need to be written to, then write to them.</span>\n\ 411: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">hieroutputters</span>( <span class=\"ruby-identifier\">level</span> ) <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">outp</span>, <span class=\"ruby-identifier\">logger</span><span class=\"ruby-operator\">|</span>\n\ 412: <span class=\"ruby-identifier\">debug_msg</span> <span class=\"ruby-value str\">"Got outputter %p"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">outp</span>\n\ 413: <span class=\"ruby-identifier\">msg</span> <span class=\"ruby-operator\">||=</span> <span class=\"ruby-identifier\">args</span>.<span class=\"ruby-identifier\">collect</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">obj</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">stringify_object</span>(<span class=\"ruby-identifier\">obj</span>)}.<span class=\"ruby-identifier\">join</span>\n\ 414: <span class=\"ruby-identifier\">outp</span>.<span class=\"ruby-identifier\">write</span>( <span class=\"ruby-identifier\">time</span>, <span class=\"ruby-identifier\">level</span>, <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">readable_name</span>, <span class=\"ruby-identifier\">frame</span>, <span class=\"ruby-identifier\">msg</span> )\n\ 415: <span class=\"ruby-keyword kw\">end</span>\n\ 416: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Write the given <tt>args</tt> to any connected outputters if <tt>level</tt> is less than or equal to this logger‘s level. </p> params: ( level, *args ) category: Instance type: Public - methods: - visibility: protected aref: M000611 name: make_level_predicate_method sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 481</span>\n\ 481: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">make_level_predicate_method</span>( <span class=\"ruby-identifier\">level</span> )\n\ 482: <span class=\"ruby-identifier\">numeric_level</span> = <span class=\"ruby-constant\">LEVELS</span>[<span class=\"ruby-identifier\">level</span>]\n\ 483: <span class=\"ruby-constant\">Proc</span>.<span class=\"ruby-identifier\">new</span> { <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">level</span> <span class=\"ruby-operator\"><</span> <span class=\"ruby-identifier\">numeric_level</span> }\n\ 484: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return a Proc suitable for installing as a predicate method for the given logging level. </p> params: ( level ) - visibility: protected aref: M000612 name: make_writer_method sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 489</span>\n\ 489: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">make_writer_method</span>( <span class=\"ruby-identifier\">level</span> )\n\ 490: <span class=\"ruby-constant\">Proc</span>.<span class=\"ruby-identifier\">new</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">write</span>(<span class=\"ruby-identifier\">level</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span>)}\n\ 491: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return a Proc suitable for installing as a log-writing method for the given logging level. </p> params: ( level ) - visibility: protected aref: M000610 name: method_missing sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 457</span>\n\ 457: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">method_missing</span>( <span class=\"ruby-identifier\">sym</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 458: <span class=\"ruby-identifier\">name</span> = <span class=\"ruby-identifier\">sym</span>.<span class=\"ruby-identifier\">to_s</span>\n\ 459: <span class=\"ruby-identifier\">level</span> = <span class=\"ruby-identifier\">name</span>[<span class=\"ruby-regexp re\">/\\w+/</span>].<span class=\"ruby-identifier\">to_sym</span>\n\ 460: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">super</span> <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LEVELS</span>.<span class=\"ruby-identifier\">member?</span>( <span class=\"ruby-identifier\">level</span> )\n\ 461: <span class=\"ruby-identifier\">code</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 462: \n\ 463: <span class=\"ruby-keyword kw\">case</span> <span class=\"ruby-identifier\">name</span>\n\ 464: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-regexp re\">/^\\w+\\?/</span>\n\ 465: <span class=\"ruby-identifier\">code</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">make_level_predicate_method</span>( <span class=\"ruby-identifier\">level</span> )\n\ 466: \n\ 467: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-regexp re\">/^\\w+$/</span>\n\ 468: <span class=\"ruby-identifier\">code</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">make_writer_method</span>( <span class=\"ruby-identifier\">level</span> )\n\ 469: \n\ 470: <span class=\"ruby-keyword kw\">else</span>\n\ 471: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">super</span>\n\ 472: <span class=\"ruby-keyword kw\">end</span>\n\ 473: \n\ 474: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">send</span>( <span class=\"ruby-identifier\">:define_method</span>, <span class=\"ruby-identifier\">sym</span>, <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">code</span> )\n\ 475: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">method</span>( <span class=\"ruby-identifier\">sym</span> ).<span class=\"ruby-identifier\">call</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 476: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Auto-install logging methods (ie., methods whose names match one of Arrow::Logger::LEVELS. </p> params: ( sym, *args ) - visibility: protected aref: M000609 name: stringify_object sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/logger.rb, line 443</span>\n\ 443: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">stringify_object</span>( <span class=\"ruby-identifier\">obj</span> )\n\ 444: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">case</span> <span class=\"ruby-identifier\">obj</span>\n\ 445: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Exception</span>\n\ 446: <span class=\"ruby-value str\">"%s:\\n %s"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">obj</span>.<span class=\"ruby-identifier\">message</span>, <span class=\"ruby-identifier\">obj</span>.<span class=\"ruby-identifier\">backtrace</span>.<span class=\"ruby-identifier\">join</span>(<span class=\"ruby-value str\">"\\n "</span>) ]\n\ 447: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">String</span>\n\ 448: <span class=\"ruby-identifier\">obj</span>\n\ 449: <span class=\"ruby-keyword kw\">else</span>\n\ 450: <span class=\"ruby-identifier\">obj</span>.<span class=\"ruby-identifier\">inspect</span>\n\ 451: <span class=\"ruby-keyword kw\">end</span>\n\ 452: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Dump the given object for output in the log. </p> params: ( obj ) category: Instance type: Protected
---
--- - name: SVNRev desc: |+ SVN Revision value: "%q$Rev: 439 $" - name: SVNId desc: |+ SVN Id value: "%q$Id: logger.rb 439 2008-04-10 23:27:34Z deveiant $" - name: LEVELS desc: |+ Construct a log levels Hash on the fly value: "[ :debug, :info, :notice, :warning, :error, :crit, :alert, :emerg, ].inject({}) {|hsh, sym| hsh[ sym ] = hsh.length;" - name: LEVEL_NAMES value: LEVELS.invert
Generated with the Darkfish Rdoc Generator.