module MrLogaLoga::Extensions::RailsExtension::LoggerPatch

This patches ActiveSupport::Logger to allow properly formatting keyword arguments

Public Instance Methods

broadcast(logger) click to toggle source
Calls superclass method
# File lib/mr_loga_loga/extensions/rails.rb, line 69
def broadcast(logger)
  Module.new do
    # We need to patch this method as otherwise calling add with keyword arguments results in argument errors.
    # Rails calls `broadcast` for the logger configured in `Rails.logger`, which means that any invocations of
    # Rails.logger.add result in running through this method.
    #
    # TODO: Remove once patched in Rails
    define_method(:add) do |*args, **kwargs, &block|
      logger.add(*args, **kwargs, &block)
      super(*args, **kwargs, &block)
    end

    define_method(:<<) do |x|
      logger << x
      super(x)
    end

    define_method(:close) do
      logger.close
      super()
    end

    define_method(:progname=) do |name|
      logger.progname = name
      super(name)
    end

    define_method(:formatter=) do |formatter|
      logger.formatter = formatter
      super(formatter)
    end

    define_method(:level=) do |level|
      logger.level = level
      super(level)
    end

    define_method(:local_level=) do |level|
      logger.local_level = level if logger.respond_to?(:local_level=)
      super(level) if respond_to?(:local_level=)
    end

    define_method(:silence) do |level = Logger::ERROR, &block|
      if logger.respond_to?(:silence)
        logger.silence(level) do
          if defined?(super)
            super(level, &block)
          else
            block.call(self)
          end
        end
      else
        if defined?(super)
          super(level, &block)
        else
          block.call(self)
        end
      end
    end
  end
end
included(base) click to toggle source

rubocop:disable all

# File lib/mr_loga_loga/extensions/rails.rb, line 67
def included base
  base.instance_eval do
    def broadcast(logger)
      Module.new do
        # We need to patch this method as otherwise calling add with keyword arguments results in argument errors.
        # Rails calls `broadcast` for the logger configured in `Rails.logger`, which means that any invocations of
        # Rails.logger.add result in running through this method.
        #
        # TODO: Remove once patched in Rails
        define_method(:add) do |*args, **kwargs, &block|
          logger.add(*args, **kwargs, &block)
          super(*args, **kwargs, &block)
        end

        define_method(:<<) do |x|
          logger << x
          super(x)
        end

        define_method(:close) do
          logger.close
          super()
        end

        define_method(:progname=) do |name|
          logger.progname = name
          super(name)
        end

        define_method(:formatter=) do |formatter|
          logger.formatter = formatter
          super(formatter)
        end

        define_method(:level=) do |level|
          logger.level = level
          super(level)
        end

        define_method(:local_level=) do |level|
          logger.local_level = level if logger.respond_to?(:local_level=)
          super(level) if respond_to?(:local_level=)
        end

        define_method(:silence) do |level = Logger::ERROR, &block|
          if logger.respond_to?(:silence)
            logger.silence(level) do
              if defined?(super)
                super(level, &block)
              else
                block.call(self)
              end
            end
          else
            if defined?(super)
              super(level, &block)
            else
              block.call(self)
            end
          end
        end
      end
    end
  end
end