7. Logging
7.1. Overview
Logging is a pretty common activity in many applications. Because it is so common, Needle provides a powerful framework for logging messages in a consistent manner.
Needle’s logging framework is built on top of the standard Ruby Logger library. However, it extends that library to add additional functionality, including customizable message formats and a centralized location for obtaining logger instances.
This centralized location is the LogFactory.
7.2. LogFactory
The LogFactory is available as a service, so that any component that needs a logger instance can gain easy access to one. The factory’s service name is :logs.
factory = reg.logs
You obtain logger instances from the factory by passing a logger name to #get:
logger = reg.logs.get "a logger name"
Subsequent calls to #get will return the same logger instance for the given logger name.
Loggers for Services
Typically, you’ll use this to assign a logger instance to a service when it is constructed. In that case, the name of the logger is the fully-qualified name of the service:
  reg.register( :foo ) do |c,p|
    Foo.new( c.logs.get( p.fullname ) )
  end
	As a convenience, if the value passed to #get responds to either fullname or name, the return value of that message will be used as the name. Thus, you can do the following:
  reg.register( :foo ) do |c,p|
    Foo.new( c.logs.get( p ) )
  end
	As a further convenience, there is a :log_for service that is parameterized. Just pass the name of the log to retreive (or the service point instance) and it will return the log handle directly:
  reg.register( :foo ) do |c,p|
    Foo.new( c.log_for( p ) )
  end
   7.3. Configuration
You can configure the LogFactory when you create the registry by passing a hash as the :logs option to Registry.new. The hash may have the following properties:
| :device | Should refer to an IO or pseudo-IO object that will receive #writeand#closemessages. | 
| :filename | The name of the file to write log messages to. | 
| :roll_age | The number of days before the log should be rolled. | 
| :roll_frequency | Either ‘daily’, ‘weekly’, or ‘monthly’, indicating how often the log should be rolled. | 
| :roll_size | The maximum size that a log file may grow to before it is rolled. | 
| :default_date_format | A strftime-formatted string to use for formatting message dates and times. | 
| :default_message_format | A printf-styled format string to use when formatting messages. It’s format is reminiscent of Log4r, but differs in some options. See the API documentation for Needle::Logger for details. | 
| :default_level | One of :debug,:info,:warn,:error, or:fatal, indicating the default level of logging detail to use. | 
| :levels | Another hash of pattern/level or pattern/hash pairs, where the pattern is a string describing the logger name (or names) that it matches. If the corresponding value of a key is a symbol or a string, then it describes the logging level to use for loggers that match it. If the value is a hash, then it may contain :level,:date_format, or:message_formatkeys that apply to matching logs. | 
By default, the filename is ”./needle.log”, and the roll_size is one megabyte. The default level is :debug. If you wanted to specify a different filename and default level of :warn, you could do:
  reg = Needle::Registry.new(
    :logs => {
      :filename => "./my-app.log",
      :default_level => :warn }
  )
	Alternatively, you can easily put the logging configuration in a YAML file and read it in, like so:
  require 'yaml'
  reg = Needle::Registry.new(
    :logs => YAML.load( File.read( "log-conf.yml" ) )
  )