aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2010-06-24 13:23:43 +0200
committerJosé Valim <jose.valim@gmail.com>2010-06-24 13:23:43 +0200
commit6788db824ab732b13493a9d702dd8fb89fa153c8 (patch)
treead9314fdd10b55ebb035959a71be0de921cb0d02 /railties/lib
parent5441e082f9478ddb3c676c681b09786f1391483c (diff)
downloadrails-6788db824ab732b13493a9d702dd8fb89fa153c8.tar.gz
rails-6788db824ab732b13493a9d702dd8fb89fa153c8.tar.bz2
rails-6788db824ab732b13493a9d702dd8fb89fa153c8.zip
Move Rails::LogSubscriber to ActiveSupport::LogSubscriber, allowing frameworks like ActiveRecord and ActiveResource to log outsude Rails::Application [#4816 state:resolved]
Diffstat (limited to 'railties/lib')
-rw-r--r--railties/lib/rails.rb1
-rw-r--r--railties/lib/rails/application/configuration.rb2
-rw-r--r--railties/lib/rails/log_subscriber.rb115
-rw-r--r--railties/lib/rails/log_subscriber/test_helper.rb97
-rw-r--r--railties/lib/rails/rack/logger.rb24
-rw-r--r--railties/lib/rails/railtie.rb34
6 files changed, 14 insertions, 259 deletions
diff --git a/railties/lib/rails.rb b/railties/lib/rails.rb
index ed66f493e6..bbf28a8c08 100644
--- a/railties/lib/rails.rb
+++ b/railties/lib/rails.rb
@@ -9,7 +9,6 @@ require 'active_support/core_ext/logger'
require 'rails/application'
require 'rails/version'
require 'rails/deprecation'
-require 'rails/log_subscriber'
require 'active_support/railtie'
require 'action_dispatch/railtie'
diff --git a/railties/lib/rails/application/configuration.rb b/railties/lib/rails/application/configuration.rb
index 25e54e9dce..e3165b2d4c 100644
--- a/railties/lib/rails/application/configuration.rb
+++ b/railties/lib/rails/application/configuration.rb
@@ -110,7 +110,7 @@ module Rails
def colorize_logging=(val)
@colorize_logging = val
- Rails::LogSubscriber.colorize_logging = val
+ ActiveSupport::LogSubscriber.colorize_logging = val
self.generators.colorize_logging = val
end
diff --git a/railties/lib/rails/log_subscriber.rb b/railties/lib/rails/log_subscriber.rb
deleted file mode 100644
index a30701d4d5..0000000000
--- a/railties/lib/rails/log_subscriber.rb
+++ /dev/null
@@ -1,115 +0,0 @@
-require 'active_support/core_ext/class/inheritable_attributes'
-require 'active_support/notifications'
-
-module Rails
- # Rails::LogSubscriber is an object set to consume ActiveSupport::Notifications
- # on initialization with solely purpose of logging. The log subscriber dispatches
- # notifications to a regirested object based on its given namespace.
- #
- # An example would be Active Record log subscriber responsible for logging queries:
- #
- # module ActiveRecord
- # class Railtie
- # class LogSubscriber < Rails::LogSubscriber
- # def sql(event)
- # "#{event.payload[:name]} (#{event.duration}) #{event.payload[:sql]}"
- # end
- # end
- # end
- # end
- #
- # It's finally registed as:
- #
- # Rails::LogSubscriber.add :active_record, ActiveRecord::Railtie::LogSubscriber.new
- #
- # So whenever a "sql.active_record" notification arrive to Rails::LogSubscriber,
- # it will properly dispatch the event (ActiveSupport::Notifications::Event) to
- # the sql method.
- #
- # This is useful because it avoids spanning several log subscribers just for logging
- # purposes(which slows down the main thread). Besides of providing a centralized
- # facility on top of Rails.logger.
- #
- # Log subscriber also has some helpers to deal with logging and automatically flushes
- # all logs when the request finishes (via action_dispatch.callback notification).
- class LogSubscriber
- mattr_accessor :colorize_logging
- self.colorize_logging = true
-
- # Embed in a String to clear all previous ANSI sequences.
- CLEAR = "\e[0m"
- BOLD = "\e[1m"
-
- # Colors
- BLACK = "\e[30m"
- RED = "\e[31m"
- GREEN = "\e[32m"
- YELLOW = "\e[33m"
- BLUE = "\e[34m"
- MAGENTA = "\e[35m"
- CYAN = "\e[36m"
- WHITE = "\e[37m"
-
- def self.add(namespace, log_subscriber, notifier = ActiveSupport::Notifications)
- log_subscribers << log_subscriber
- @flushable_loggers = nil
-
- log_subscriber.public_methods(false).each do |event|
- notifier.subscribe("#{event}.#{namespace}") do |*args|
- next if log_subscriber.logger.nil?
-
- begin
- log_subscriber.send(event, ActiveSupport::Notifications::Event.new(*args))
- rescue Exception => e
- Rails.logger.error "Could not log #{args[0].inspect} event. #{e.class}: #{e.message}"
- end
- end
- end
- end
-
- def self.log_subscribers
- @log_subscribers ||= []
- end
-
- def self.flushable_loggers
- @flushable_loggers ||= begin
- loggers = log_subscribers.map(&:logger)
- loggers.uniq!
- loggers.select { |l| l.respond_to?(:flush) }
- end
- end
-
- # Flush all log_subscribers' logger.
- def self.flush_all!
- flushable_loggers.each(&:flush)
- end
-
- # By default, we use the Rails.logger for logging.
- def logger
- Rails.logger
- end
-
- protected
-
- %w(info debug warn error fatal unknown).each do |level|
- class_eval <<-METHOD, __FILE__, __LINE__ + 1
- def #{level}(*args, &block)
- return unless logger
- logger.#{level}(*args, &block)
- end
- METHOD
- end
-
- # Set color by using a string or one of the defined constants. If a third
- # option is set to true, it also adds bold to the string. This is based
- # on Highline implementation and it automatically appends CLEAR to the end
- # of the returned String.
- #
- def color(text, color, bold=false)
- return text unless colorize_logging
- color = self.class.const_get(color.to_s.upcase) if color.is_a?(Symbol)
- bold = bold ? BOLD : ""
- "#{bold}#{color}#{text}#{CLEAR}"
- end
- end
-end
diff --git a/railties/lib/rails/log_subscriber/test_helper.rb b/railties/lib/rails/log_subscriber/test_helper.rb
deleted file mode 100644
index 9b7b0738cd..0000000000
--- a/railties/lib/rails/log_subscriber/test_helper.rb
+++ /dev/null
@@ -1,97 +0,0 @@
-require 'rails/log_subscriber'
-
-module Rails
- class LogSubscriber
- # Provides some helpers to deal with testing log subscribers by setting up
- # notifications. Take for instance Active Record subscriber tests:
- #
- # class SyncLogSubscriberTest < ActiveSupport::TestCase
- # include Rails::LogSubscriber::TestHelper
- # Rails::LogSubscriber.add(:active_record, ActiveRecord::Railties::LogSubscriber.new)
- #
- # def test_basic_query_logging
- # Developer.all
- # wait
- # assert_equal 1, @logger.logged(:debug).size
- # assert_match /Developer Load/, @logger.logged(:debug).last
- # assert_match /SELECT \* FROM "developers"/, @logger.logged(:debug).last
- # end
- #
- # class SyncLogSubscriberTest < ActiveSupport::TestCase
- # include Rails::LogSubscriber::SyncTestHelper
- # include LogSubscriberTest
- # end
- #
- # class AsyncLogSubscriberTest < ActiveSupport::TestCase
- # include Rails::LogSubscriber::AsyncTestHelper
- # include LogSubscriberTest
- # end
- # end
- #
- # All you need to do is to ensure that your log subscriber is added to Rails::Subscriber,
- # as in the second line of the code above. The test helpers is reponsible for setting
- # up the queue, subscriptions and turning colors in logs off.
- #
- # The messages are available in the @logger instance, which is a logger with limited
- # powers (it actually do not send anything to your output), and you can collect them
- # doing @logger.logged(level), where level is the level used in logging, like info,
- # debug, warn and so on.
- #
- module TestHelper
- def setup
- @logger = MockLogger.new
- @notifier = ActiveSupport::Notifications::Notifier.new(queue)
-
- Rails::LogSubscriber.colorize_logging = false
-
- set_logger(@logger)
- ActiveSupport::Notifications.notifier = @notifier
- end
-
- def teardown
- set_logger(nil)
- ActiveSupport::Notifications.notifier = nil
- end
-
- class MockLogger
- attr_reader :flush_count
-
- def initialize
- @flush_count = 0
- @logged = Hash.new { |h,k| h[k] = [] }
- end
-
- def method_missing(level, message)
- @logged[level] << message
- end
-
- def logged(level)
- @logged[level].compact.map { |l| l.to_s.strip }
- end
-
- def flush
- @flush_count += 1
- end
- end
-
- # Wait notifications to be published.
- def wait
- @notifier.wait
- end
-
- # Overwrite if you use another logger in your log subscriber:
- #
- # def logger
- # ActiveRecord::Base.logger = @logger
- # end
- #
- def set_logger(logger)
- Rails.logger = logger
- end
-
- def queue
- ActiveSupport::Notifications::Fanout.new
- end
- end
- end
-end \ No newline at end of file
diff --git a/railties/lib/rails/rack/logger.rb b/railties/lib/rails/rack/logger.rb
index 73e9af3b41..b3dc1f894c 100644
--- a/railties/lib/rails/rack/logger.rb
+++ b/railties/lib/rails/rack/logger.rb
@@ -1,10 +1,9 @@
-require 'rails/log_subscriber'
require 'active_support/core_ext/time/conversions'
module Rails
module Rack
# Log the request started and flush all loggers after it.
- class Logger < Rails::LogSubscriber
+ class Logger < ActiveSupport::LogSubscriber
def initialize(app)
@app = app
end
@@ -16,20 +15,19 @@ module Rails
after_dispatch(env)
end
- protected
+ protected
- def before_dispatch(env)
- request = ActionDispatch::Request.new(env)
- path = request.fullpath
+ def before_dispatch(env)
+ request = ActionDispatch::Request.new(env)
+ path = request.fullpath
- info "\n\nStarted #{env["REQUEST_METHOD"]} \"#{path}\" " \
- "for #{request.ip} at #{Time.now.to_default_s}"
- end
-
- def after_dispatch(env)
- Rails::LogSubscriber.flush_all!
- end
+ info "\n\nStarted #{env["REQUEST_METHOD"]} \"#{path}\" " \
+ "for #{request.ip} at #{Time.now.to_default_s}"
+ end
+ def after_dispatch(env)
+ ActiveSupport::LogSubscriber.flush_all!
+ end
end
end
end
diff --git a/railties/lib/rails/railtie.rb b/railties/lib/rails/railtie.rb
index ad776933f2..dbdbfea509 100644
--- a/railties/lib/rails/railtie.rb
+++ b/railties/lib/rails/railtie.rb
@@ -114,36 +114,6 @@ module Rails
# end
# end
#
- # == Adding your subscriber
- #
- # Since version 3.0, Rails ships with a notification system which is used for several
- # purposes, including logging. If you are sending notifications in your Railtie, you may
- # want to add a subscriber to consume such notifications for logging purposes.
- #
- # The subscriber is added under the railtie_name namespace and only consumes notifications
- # under the given namespace. For example, let's suppose your railtie is publishing the
- # following "something_expensive" instrumentation:
- #
- # ActiveSupport::Notifications.instrument "my_railtie.something_expensive" do
- # # something expensive
- # end
- #
- # You can log this instrumentation with your own Rails::Subscriber:
- #
- # class MyRailtie::Subscriber < Rails::Subscriber
- # def something_expensive(event)
- # info("Something expensive took %.1fms" % event.duration)
- # end
- # end
- #
- # By registering it:
- #
- # class MyRailtie < Railtie
- # subscriber :my_gem, MyRailtie::Subscriber.new
- # end
- #
- # Take a look in Rails::Subscriber docs for more information.
- #
# == Application, Plugin and Engine
#
# A Rails::Engine is nothing more than a Railtie with some initializers already set.
@@ -176,8 +146,8 @@ module Rails
ActiveSupport::Deprecation.warn "railtie_name is deprecated and has no effect", caller
end
- def log_subscriber(name, log_subscriber)
- Rails::LogSubscriber.add(name, log_subscriber)
+ def log_subscriber(*)
+ ActiveSupport::Deprecation.warn "log_subscriber is deprecated and has no effect", caller
end
def rake_tasks(&blk)