summary refs log tree commit
diff options
context:
space:
mode:
authorJoshua Peek <josh@joshpeek.com>2009-12-11 16:40:57 -0600
committerJoshua Peek <josh@joshpeek.com>2009-12-11 16:40:57 -0600
commit78ae5ef9c7e8c9410f18063bcb130e70666a0489 (patch)
tree8e748a34fdef6a0a0eea64d1a8f4989864a4d272
parent45c3d819eaa9849265280858acf5fd4c461cf049 (diff)
downloadrack-78ae5ef9c7e8c9410f18063bcb130e70666a0489.tar.gz
Simple rack logger middleware that wraps rack.errors
-rw-r--r--lib/rack.rb1
-rw-r--r--lib/rack/logger.rb20
-rw-r--r--test/spec_rack_logger.rb21
3 files changed, 42 insertions, 0 deletions
diff --git a/lib/rack.rb b/lib/rack.rb
index 3d8e8ed8..6bdb878f 100644
--- a/lib/rack.rb
+++ b/lib/rack.rb
@@ -40,6 +40,7 @@ module Rack
   autoload :Head, "rack/head"
   autoload :Lint, "rack/lint"
   autoload :Lock, "rack/lock"
+  autoload :Logger, "rack/logger"
   autoload :MethodOverride, "rack/methodoverride"
   autoload :Mime, "rack/mime"
   autoload :NullLogger, "rack/nulllogger"
diff --git a/lib/rack/logger.rb b/lib/rack/logger.rb
new file mode 100644
index 00000000..d67d8ce2
--- /dev/null
+++ b/lib/rack/logger.rb
@@ -0,0 +1,20 @@
+require 'logger'
+
+module Rack
+  # Sets up rack.logger to write to rack.errors stream
+  class Logger
+    def initialize(app, level = ::Logger::INFO)
+      @app, @level = app, level
+    end
+
+    def call(env)
+      logger = ::Logger.new(env['rack.errors'])
+      logger.level = @level
+
+      env['rack.logger'] = logger
+      @app.call(env)
+    ensure
+      logger.close
+    end
+  end
+end
diff --git a/test/spec_rack_logger.rb b/test/spec_rack_logger.rb
new file mode 100644
index 00000000..d55b9c77
--- /dev/null
+++ b/test/spec_rack_logger.rb
@@ -0,0 +1,21 @@
+require 'rack/logger'
+require 'rack/lint'
+require 'stringio'
+
+context "Rack::Logger" do
+  specify "logs to rack.errors" do
+    app = lambda { |env|
+      log = env['rack.logger']
+      log.debug("Created logger")
+      log.info("Program started")
+      log.warn("Nothing to do!")
+
+      [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]]
+    }
+
+    errors = StringIO.new
+    Rack::Logger.new(app).call({'rack.errors' => errors})
+    errors.string.should.match "INFO -- : Program started"
+    errors.string.should.match "WARN -- : Nothing to do"
+  end
+end