The log will now queue any log messages created when there is no
destination, and will flush the queue when a destination is added.

Signed-off-by: Nick Lewis <[email protected]>
---
 lib/puppet/util/log.rb         |   17 +++++++++++++++++
 spec/unit/util/log_spec.rb     |    6 ++++++
 spec/unit/util/logging_spec.rb |    6 ++++++
 3 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/lib/puppet/util/log.rb b/lib/puppet/util/log.rb
index ba23e12..64a8d14 100644
--- a/lib/puppet/util/log.rb
+++ b/lib/puppet/util/log.rb
@@ -31,6 +31,8 @@ class Puppet::Util::Log
 
     @destinations = {}
 
+    @queued = []
+
     class << self
         include Puppet::Util
         include Puppet::Util::ClassGen
@@ -145,6 +147,7 @@ class Puppet::Util::Log
             else
                 @destinations[dest] = type.new()
             end
+            flushqueue
         rescue => detail
             if Puppet[:debug]
                 puts detail.backtrace
@@ -167,6 +170,8 @@ class Puppet::Util::Log
             return
         end
 
+        queuemessage(msg) if @destinations.count == 0
+
         @destinations.each do |name, dest|
             threadlock(dest) do
                 dest.handle(msg)
@@ -174,6 +179,18 @@ class Puppet::Util::Log
         end
     end
 
+    def Log.queuemessage(msg)
+        @queued.push(msg)
+    end
+
+    def Log.flushqueue
+        return unless @destinations.size >= 1
+        @queued.each do |msg|
+            Log.newmessage(msg)
+        end
+        @queued.clear
+    end
+
     def Log.sendlevel?(level)
         @levels.index(level) >= @loglevel
     end
diff --git a/spec/unit/util/log_spec.rb b/spec/unit/util/log_spec.rb
index 7aaa580..c72078f 100755
--- a/spec/unit/util/log_spec.rb
+++ b/spec/unit/util/log_spec.rb
@@ -84,6 +84,12 @@ describe Puppet::Util::Log do
             Puppet::Util::Log.new(:level => :notice, :message => 
:foo).message.should == "foo"
         end
 
+        it "should write queued logs when the first destination is specified" 
do
+            Hash.any_instance.stubs(:[]=)
+            Puppet::Util::Log.expects(:flushqueue)
+            Puppet::Util::Log.newdestination(:console)
+        end
+
         it "should convert the level to a symbol if it's passed in as a 
string" do
             Puppet::Util::Log.new(:level => "notice", :message => 
:foo).level.should == :notice
         end
diff --git a/spec/unit/util/logging_spec.rb b/spec/unit/util/logging_spec.rb
index aee308e..41b07d4 100755
--- a/spec/unit/util/logging_spec.rb
+++ b/spec/unit/util/logging_spec.rb
@@ -40,6 +40,12 @@ describe Puppet::Util::Logging do
             @logger.notice "foo"
         end
 
+        it "should queue logs sent without a specified destination" do
+            Puppet::Util::Log.expects(:queuemessage)
+
+            @logger.notice "foo"
+        end
+
         it "should use the path of any provided resource type" do
             resource = Puppet::Type.type(:mount).new :name => "foo"
 
-- 
1.7.1

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to