85 lines
2.2 KiB
Ruby
85 lines
2.2 KiB
Ruby
module Yell #:nodoc:
|
|
# AdapterNotFound is raised whenever you want to instantiate an
|
|
# adapter that does not exist.
|
|
class AdapterNotFound < StandardError; end
|
|
|
|
# This module provides the interface to attaching adapters to
|
|
# the logger. You should not have to call the corresponding classes
|
|
# directly.
|
|
module Adapters
|
|
class Collection
|
|
def initialize( options = {} )
|
|
@options = options
|
|
@collection = []
|
|
end
|
|
|
|
def add( type = :file, *args, &block )
|
|
options = [@options, *args].inject(Hash.new) do |h, c|
|
|
h.merge( [String, Pathname].include?(c.class) ? {:filename => c} : c )
|
|
end
|
|
|
|
# remove possible :null adapters
|
|
@collection.shift if @collection.first.instance_of?(Yell::Adapters::Base)
|
|
|
|
new_adapter = Yell::Adapters.new(type, options, &block)
|
|
@collection.push(new_adapter)
|
|
|
|
new_adapter
|
|
end
|
|
|
|
def empty?
|
|
@collection.empty?
|
|
end
|
|
|
|
# @private
|
|
def write( event )
|
|
@collection.each { |c| c.write(event) }
|
|
true
|
|
end
|
|
|
|
# @private
|
|
def close
|
|
@collection.each { |c| c.close }
|
|
end
|
|
end
|
|
|
|
# holds the list of known adapters
|
|
@adapters = {}
|
|
|
|
# Register your own adapter here
|
|
#
|
|
# @example
|
|
# Yell::Adapters.register( :myadapter, MyAdapter )
|
|
def self.register( name, klass )
|
|
@adapters[name.to_sym] = klass
|
|
end
|
|
|
|
# Returns an instance of the given processor type.
|
|
#
|
|
# @example A simple file adapter
|
|
# Yell::Adapters.new( :file )
|
|
def self.new( type, options = {}, &block )
|
|
return type if type.is_a?(Yell::Adapters::Base)
|
|
|
|
adapter = case type
|
|
when STDOUT then @adapters[:stdout]
|
|
when STDERR then @adapters[:stderr]
|
|
else @adapters[type.to_sym]
|
|
end
|
|
|
|
raise AdapterNotFound.new(type) if adapter.nil?
|
|
adapter.new(options, &block)
|
|
end
|
|
end
|
|
end
|
|
|
|
# Base for all adapters
|
|
require File.dirname(__FILE__) + '/adapters/base'
|
|
|
|
# IO based adapters
|
|
require File.dirname(__FILE__) + '/adapters/io'
|
|
require File.dirname(__FILE__) + '/adapters/streams'
|
|
require File.dirname(__FILE__) + '/adapters/file'
|
|
require File.dirname(__FILE__) + '/adapters/datefile'
|
|
|