reevoo/sapience-rb

View on GitHub
lib/sapience/rails/engine.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true
require "sapience"
require "sapience/extensions/action_controller/live" if defined?(ActionController::Live)
require "sapience/extensions/action_controller/log_subscriber"
require "sapience/extensions/action_controller/notifications"
require "sapience/extensions/action_dispatch/debug_exceptions"
require "sapience/extensions/action_view/streaming_template_renderer"
if defined?(ActiveRecord)
  require "sapience/extensions/active_record/log_subscriber"
  require "sapience/extensions/active_record/notifications"
end
require "sapience/extensions/active_job/notifications" if defined?(ActiveJob)
require "sapience/extensions/rails/rack/logger"
require "sapience/extensions/rails/rack/logger_info_as_debug"
require "sapience/extensions/action_view/log_subscriber"
require "sapience/loggers/concurrent"

module Sapience
  module Rails
    class Engine < ::Rails::Engine
      # Replace Rails logger initializer
      ::Rails::Application::Bootstrap.initializers.delete_if { |i| i.name == :initialize_logger }

      initializer :initialize_logger, group: :all, before: :bootstrap_hook do
        Sapience.configure

        %i[active_record action_controller action_mailer action_view].each do |name|
          ActiveSupport.on_load(name) { include Sapience::Loggable }
        end
        ActiveSupport.on_load(:action_cable) { self.logger = Sapience["ActionCable"] }
      end

      # Before any initializers run, but after the gems have been loaded
      config.before_initialize do
        # Replace the Mongoid Logger
        Mongoid.logger              = Sapience[Mongoid] if defined?(Mongoid)
        Moped.logger                = Sapience[Moped] if defined?(Moped)

        # Replace the Resque Logger
        Resque.logger               = Sapience[Resque] if defined?(Resque) && Resque.respond_to?(:logger)

        # Replace the Sidekiq logger
        Sidekiq::Logging.logger     = Sapience[Sidekiq] if defined?(Sidekiq)

        # Replace the Sidetiq logger
        Sidetiq.logger              = Sapience[Sidetiq] if defined?(Sidetiq)

        # Replace the Sequel logger
        if defined?(Sequel::Database) && Sequel::Database.respond_to?(:logger=)
          Sequel::Database.logger = Sapience[Sequel]
        end

        # Replace the Raven logger
        # Raven::Configuration.logger = Sapience[Raven::Configuration] if defined?(Raven::Configuration)
        Raven.send(:include, Sapience::Loggable)

        # Replace the Sneakers logger
        Sneakers.configure(log: Sapience[Sneakers]) if defined?(Sneakers)

        # Replace the Bugsnag logger
        Bugsnag.configure { |config| config.logger = Sapience[Bugsnag] } if defined?(Bugsnag)

        # Set the logger for concurrent-ruby
        Concurrent.global_logger = Sapience::Loggers::Concurrent.new if defined?(Concurrent)
      end

      # Before any initializers run, but after the gems have been loaded
      config.after_initialize do
        # in the rare case a gem disables logging but still requires a logger (teaspoon gem)
        ::Rails.logger ||= Sapience[::Rails]

        require "sapience/extensions/action_cable/tagged_logger_proxy" if defined?(ActionCable)
        require "sapience/extensions/active_model_serializers/logging" if defined?(ActiveModelSerializers)
        require "sapience/extensions/active_job/logging" if defined?(ActiveJob)
        # Replace the Bugsnag logger
        Bugsnag.configure { |config| config.logger = Sapience[Bugsnag] } if defined?(Bugsnag)

        # Make rails less noisy
        Silencer.remove_log_subscriptions if Sapience.config.silent_rails

        Sapience::Extensions::ActionController::LogSubscriber.attach_to :action_controller
        # Sapience::Extensions::ActiveSupport::MailerLogSubscriber.attach_to :action_mailer
        if defined?(ActiveRecord) && !Sapience.config.silent_active_record
          Sapience::Extensions::ActiveRecord::Notifications.use
        end
        Sapience::Extensions::ActionView::LogSubscriber.attach_to :action_view
        # Sapience::Extensions::ActiveJob::LogSubscriber.attach_to :active_job
        Sapience::Extensions::ActionController::Notifications.use if Sapience.config.rails_ac_metrics
        Sapience::Extensions::ActiveJob::Notifications.use if defined?(ActiveJob)
      end
    end
  end
end