EagerELK/ditty

View on GitHub
lib/ditty/services/logger.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require 'logger'
require 'yaml'
require 'singleton'
require 'active_support/inflector'
require 'ditty/services/settings'
require 'active_support/core_ext/object/blank'

module Ditty
  module Services
    # This is the central logger for Ditty. It can be configured to log to
    # multiple endpoints through Ditty Settings. The default configuration is to
    # send logs to $stdout
    class Logger
      include Singleton

      attr_reader :loggers

      def initialize
        @loggers = []
        return if config[:loggers].blank?

        config[:loggers].each do |values|
          klass = values[:class].constantize
          opts = tr(values[:options]) || nil
          logger = klass.new(opts)
          logger.level = klass.const_get(values[:level].to_sym) if values[:level]
          @loggers << logger
        end
      end

      # TODO: Refac this so that you can log something like ES to a separate logger

      def method_missing(method, *args, &block)
        loggers.each { |logger| logger.send(method, *args, &block) }
      end

      def respond_to_missing?(method, _include_private = false)
        return true if loggers.any? { |logger| logger.respond_to?(method) }

        super
      end

      def warn(*args)
        method_missing(:warn, *args)
      end

      private

        def config
          default.merge ::Ditty::Services::Settings.values(:logger) || {}
        end

        def tr(val)
          {
            '$stdout' => $stdout,
            '$stderr' => $stderr
          }[val] || val
        end

        def default
          { loggers: [{ name: 'default', class: 'Logger' }] }
        end

        class << self
          def method_missing(method, *args, &block)
            instance.send(method, *args, &block)
          end

          def respond_to_missing?(method, _include_private)
            return true if instance.respond_to?(method)

            super
          end
        end
    end
  end
end