From 0d43932dbf880bffffee9944f13afe745268d633 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Tue, 11 Jun 2024 12:50:23 +0900 Subject: [PATCH] Add `Rack::Logger`. --- lib/rack/contrib.rb | 1 + lib/rack/logger.rb | 22 ++++++++++++++++++++++ test/spec_logger.rb | 23 +++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 lib/rack/logger.rb create mode 100644 test/spec_logger.rb diff --git a/lib/rack/contrib.rb b/lib/rack/contrib.rb index 6d7ad963..38fd91af 100644 --- a/lib/rack/contrib.rb +++ b/lib/rack/contrib.rb @@ -30,6 +30,7 @@ def self.release autoload :LazyConditionalGet, "rack/contrib/lazy_conditional_get" autoload :LighttpdScriptNameFix, "rack/contrib/lighttpd_script_name_fix" autoload :Locale, "rack/contrib/locale" + autoload :Logger, "rack/contrib/logger" autoload :MailExceptions, "rack/contrib/mailexceptions" autoload :PostBodyContentTypeParser, "rack/contrib/post_body_content_type_parser" autoload :ProcTitle, "rack/contrib/proctitle" diff --git a/lib/rack/logger.rb b/lib/rack/logger.rb new file mode 100644 index 00000000..3fa9b1aa --- /dev/null +++ b/lib/rack/logger.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require 'logger' + +require 'rack/constants' + +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) + end + end +end diff --git a/test/spec_logger.rb b/test/spec_logger.rb new file mode 100644 index 00000000..9816cafb --- /dev/null +++ b/test/spec_logger.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'minitest/autorun' +require 'rack/logger' + +describe Rack::Logger 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!"]] + } + + it "conform to Rack::Lint" do + errors = StringIO.new + a = Rack::Lint.new(Rack::Logger.new(app)) + Rack::MockRequest.new(a).get('/', 'rack.errors' => errors) + errors.string.must_match(/INFO -- : Program started/) + errors.string.must_match(/WARN -- : Nothing to do/) + end +end