diff --git a/src/main/ruby/jruby/rack/rails/rails_logger.rb b/src/main/ruby/jruby/rack/rails/rails_logger.rb new file mode 100644 index 00000000..524517fb --- /dev/null +++ b/src/main/ruby/jruby/rack/rails/rails_logger.rb @@ -0,0 +1,7 @@ +require 'active_support/logger_silence' unless defined?(ActiveSupport::LoggerSilence) + +module JRuby::Rack + class RailsLogger < JRuby::Rack::Logger + include ActiveSupport::LoggerSilence + end +end diff --git a/src/main/ruby/jruby/rack/rails/railtie.rb b/src/main/ruby/jruby/rack/rails/railtie.rb index 1f57087b..173300db 100644 --- a/src/main/ruby/jruby/rack/rails/railtie.rb +++ b/src/main/ruby/jruby/rack/rails/railtie.rb @@ -32,16 +32,21 @@ class Railtie < ::Rails::Railtie initializer 'set_servlet_logger', :before => :initialize_logger do |app| app.config.logger ||= begin - logger = JRuby::Rack.logger + require 'jruby/rack/rails/rails_logger' + logger = JRuby::Rack::RailsLogger.new(JRuby::Rack.context) config = app.config - log_level = config.log_level || :info - logger.level = logger.class.const_get(log_level.to_s.upcase) + log_level = config.log_level + # NOTE: not much sense to set the level to a default (e.g. :info), esp. with Java logging backends + # one could also argue we should disable silencing + # + # JRuby::Rack::RailsLogger.silencer = false + # + # although that would potentially only make sense when Java (jruby.rack.logging) backend is used. + logger.level = logger.class.const_get(log_level.to_s.upcase) if log_level log_formatter = config.log_formatter if config.respond_to?(:log_formatter) logger.formatter = log_formatter if log_formatter && logger.respond_to?(:formatter=) require 'active_support/tagged_logging' unless defined?(ActiveSupport::TaggedLogging) - logger = ActiveSupport::TaggedLogging.new(logger) # returns a logger.clone - logger.singleton_class.send(:include, ActiveSupport::LoggerSilence) if defined?(ActiveSupport::LoggerSilence) - logger + ActiveSupport::TaggedLogging.new(logger) # returns a logger.clone end end diff --git a/src/spec/ruby/jruby/rack/rails_booter_spec.rb b/src/spec/ruby/jruby/rack/rails_booter_spec.rb index ef6ffe91..30f39e3f 100644 --- a/src/spec/ruby/jruby/rack/rails_booter_spec.rb +++ b/src/spec/ruby/jruby/rack/rails_booter_spec.rb @@ -198,12 +198,9 @@ def logger=(logger); @logger = logger; end end it "gets set as config.logger (wrapped with tagged logging and logger_silence)" do - logger = JRuby::Rack::Logger.new STDERR - @config.stub(:log_level).and_return(:info) + @config.stub(:log_level).and_return(nil) @config.stub(:log_formatter).and_return(nil) - JRuby::Rack.should_receive(:logger).and_return(logger) - log_initializer.last.call(@app) rails_logger = @app.config.logger # ActiveSupport::TaggedLogging.new clones the original logger instance @@ -214,20 +211,22 @@ def logger=(logger); @logger = logger; end expect(rails_logger.silencer).to be true # sanity check silence works: value_returned = rails_logger.silence(Logger::WARN) { |logger| logger.class.name } - expect(value_returned).to eql('JRuby::Rack::Logger') + expect(value_returned).to eql('JRuby::Rack::RailsLogger') end + expect(rails_logger.level).to be(nil) # should not be set unless user configured `config.log_level` end it "has a configurable log level" do - @config.instance_eval do - def logger; @logger; end - def logger=(logger); @logger = logger; end - end + # @config.instance_eval do + # def logger; @logger; end + # def logger=(logger); @logger = logger; end + # end @config.stub(:log_formatter).and_return(nil) @config.should_receive(:log_level).and_return(:error) - log_initializer.last.call(@app) ## - @app.config.logger.level.should be(JRuby::Rack::Logger::ERROR) + log_initializer.last.call(@app) + rails_logger = @app.config.logger + expect(rails_logger.level).to be(JRuby::Rack::Logger::ERROR) end private