Permalink
Browse files

add a broadcasting logger so we can split logs

  • Loading branch information...
tenderlove committed Jan 20, 2012
1 parent 30b0e58 commit d42b3d4347547b7790d0a716e7548baccf408076
Showing with 80 additions and 0 deletions.
  1. +23 −0 activesupport/lib/active_support/logger.rb
  2. +57 −0 activesupport/test/broadcast_logger_test.rb
@@ -1,6 +1,29 @@
require 'logger'
module ActiveSupport
+ # Broadcasts logs to multiple loggers
+ class BroadcastLogger < ::Logger # :nodoc:
+ attr_reader :logs
+
+ def initialize(logs)
+ super(nil)
+ @logs = logs
+ end
+
+ def add(severity, message = nil, progname = nil, &block)
+ super
+ logs.each { |l| l.add(severity, message, progname, &block) }
+ end
+
+ def <<(x)
+ logs.each { |l| l << x }
+ end
+
+ def close
+ logs.each(&:close)
+ end
+ end
+
class Logger < ::Logger
def initialize(*args)
super
@@ -0,0 +1,57 @@
+require 'abstract_unit'
+
+module ActiveSupport
+ class BroadcastLoggerTest < TestCase
+ def test_debug
+ log1 = FakeLogger.new
+ log2 = FakeLogger.new
+
+ logger = BroadcastLogger.new [log1, log2]
+ logger.debug "foo"
+ assert_equal 'foo', log1.adds.first[2]
+ assert_equal 'foo', log2.adds.first[2]
+ end
+
+ def test_close
+ log1 = FakeLogger.new
+ log2 = FakeLogger.new
+
+ logger = BroadcastLogger.new [log1, log2]
+ logger.close
+ assert log1.closed, 'should be closed'
+ assert log2.closed, 'should be closed'
+ end
+
+ def test_chevrons
+ log1 = FakeLogger.new
+ log2 = FakeLogger.new
+
+ logger = BroadcastLogger.new [log1, log2]
+ logger << "foo"
+ assert_equal %w{ foo }, log1.chevrons
+ assert_equal %w{ foo }, log2.chevrons
+ end
+
+ class FakeLogger
+ attr_reader :adds, :closed, :chevrons
+
+ def initialize
+ @adds = []
+ @closed = false
+ @chevrons = []
+ end
+
+ def << x
+ @chevrons << x
+ end
+
+ def add(*args)
+ @adds << args
+ end
+
+ def close
+ @closed = true
+ end
+ end
+ end
+end

0 comments on commit d42b3d4

Please sign in to comment.