lib/loggability/override.rb in loggability-0.13.0 vs lib/loggability/override.rb in loggability-0.14.0

- old
+ new

@@ -41,50 +41,69 @@ def self::formatted_with( new_formatter, &block ) return self.new( formatter: new_formatter, &block ) end + ### Set up an Override that will only apply to the specified +log_hosts+. If called + ### with a +block+, call #call immediately on the Override with the block and return + ## the result of that instead. + def self::for_logger( *log_hosts, &block ) + return self.new( log_hosts: log_hosts, &block ) + end + + ### Create a new Override with the specified +settings+ that will be applied ### during a call to #call, and then reverted when #call returns. Valid +settings+ ### are: ### ### [:level] ### Set the level of all Loggers to the value. ### [:logdev] ### Set the destination log device of all Loggers to the value. + ### [:log_hosts] + ### Set the affected log hosts to the value. ### [:formatter] ### Set the formatter for all Loggers to the value (a Loggability::Formatter). ### def initialize( settings={} ) super() + @log_hosts = settings.delete( :log_hosts ) @settings = settings - @overridden_settings = {} + @overridden_settings = nil end ### Copy constructor -- make copies of the internal data structures ### when duplicated. def initialize_copy( original ) + @log_hosts = original.log_hosts.dup if original.log_hosts @settings = original.settings.dup - @overridden_settings = {} + @overridden_settings = nil end ###### public ###### + ## # The Override's settings Hash (the settings that will be applied during # an overridden #call). attr_reader :settings + ## # The original settings preserved by the Override during a call to #call, # keyed by the logger they belong to. - attr_reader :overridden_settings + attr_accessor :overridden_settings + ## + # The log hosts the Override will be applied to during an overridden + # #call. If this is +nil+, all log hosts will be affected. + attr_accessor :log_hosts + ### Call the provided block with configured overrides applied, and then restore ### the previous settings before control is returned. def call self.apply_overrides yield @@ -116,18 +135,28 @@ def formatted_with( new_formatter, &block ) return self.clone_with( formatter: new_formatter, &block ) end + ### Return a clone of the receiving Override with its log hosts set to +hosts+ + ### (instead of affecting all registered log hosts) + def for_logger( *hosts, &block ) + raise ArgumentError, "no log hosts given" if hosts.empty? + return self.clone_with( log_hosts: hosts, &block ) + end + alias_method :for_loggers, :for_logger + + ### Return the object as a human-readable string suitable for debugging. def inspect - return "#<%p:%#016x formatter: %s, level: %s, output: %s>" % [ + return "#<%p:%#016x formatter: %s, level: %s, output: %s, affecting %s log hosts>" % [ self.class, self.object_id * 2, self.settings[:formatter] || '-', self.settings[:level] || '-', self.settings[:logdev] ? self.settings[:logdev].class : '-', + self.log_hosts ? self.log_hosts.length.to_s : "all", ] end ######### @@ -135,47 +164,65 @@ ######### ### Return a clone that has been modified with the specified +new_settings+. def clone_with( new_settings, &block ) newobj = self.dup - newobj.settings.merge!( new_settings ) + newobj.merge_settings( new_settings ) if block return newobj.call( &block ) else return newobj end end + ### Merge any +new_settings+ into the receiving Override. + def merge_settings( new_settings ) + if (( new_hosts = new_settings.delete(:log_hosts) )) + self.log_hosts = new_hosts + end + self.settings.merge!( new_settings ) + end + + + ### Return the log hosts that should be affected by the Override. + def log_hosts_to_affect + rval = Array( self.log_hosts || Loggability.log_hosts.values ).uniq + return rval.map {|obj| Loggability.log_host_for(obj) } + end + + ### Apply any configured overrides to all loggers. def apply_overrides self.synchronize do - raise LocalJumpError, "can't be called re-entrantly" unless - @overridden_settings.empty? - @overridden_settings = self.gather_current_settings + raise LocalJumpError, "can't be called re-entrantly" if self.overridden_settings + self.overridden_settings = self.gather_current_settings end - Loggability.log_hosts.each do |key, host| + self.log_hosts_to_affect.each do |host| host.logger.restore_settings( self.settings ) end end ### Return a Hash of Loggers with the settings they currently have. def gather_current_settings - return Loggability.log_hosts.values.each_with_object( {} ) do |host, hash| + return self.log_hosts_to_affect.each_with_object( {} ) do |host, hash| hash[ host ] = host.logger.settings end end ### Restore the last settings saved by #apply_overrides to their corresponding ### loggers. def restore_overridden_settings - @overridden_settings.each do |host, settings| + return unless self.overridden_settings + + self.overridden_settings.each do |host, settings| host.logger.restore_settings( settings ) end - @overridden_settings.clear + + self.overridden_settings = nil end end # class Loggability::Override \ No newline at end of file