Sha256: 9d7297fb7cdcb7b18c0b8e62cfc70dcfec84223327344e92b95402c74edbf696

Contents?: true

Size: 1.69 KB

Versions: 1

Compression:

Stored size: 1.69 KB

Contents

# 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

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

      def respond_to_missing?(method, _include_private = false)
        loggers.any? { |logger| logger.respond_to?(method) }
      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)
          instance.respond_to? method
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ditty-0.8.0 lib/ditty/services/logger.rb