Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
elixir-logger / lib / elixir / logger / elixir_logger.rb
Size: Mime:
# frozen_string_literal: true

module Elixir
  # Logger
  module Logger
    # ElixirLogger
    class ElixirLogger < ::Logger
      def initialize(io_devices_and_loggers,
                     app_name: nil,
                     class_name: nil,
                     filter: nil)
        @app_name = app_name || ''
        @class_name = class_name
        @filter = Filter.new(filter)
        @logger = Timber::Logger.new(*io_devices_and_loggers)
      end

      def info(message,
               class_name: nil,
               options: nil)

        user = RequestStore.store[:current_user]

        msg = log('INFO', message, class_name)
        if user.nil?
          @logger.info msg, options
        else
          Timber.with_context(user_context(user)) do
            @logger.info msg, options
          end
        end
      end

      def error(message,
                class_name: nil,
                options: nil)
        user = RequestStore.store[:current_user]

        msg = log('ERROR', message, class_name)

        if user.nil?
          @logger.error msg, options
        else
          Timber.with_context(user_context(user)) do
            @logger.error msg, options
          end
        end
      end

      def warn(message,
               class_name: nil,
               options: nil)
        user = RequestStore.store[:current_user]

        msg = log('WARN', message, class_name)

        if user.nil?
          @logger.error msg, options
        else
          Timber.with_context(user_context(user)) do
            @logger.error msg, options
          end
        end
      end

      def debug(message,
                class_name: nil,
                options: nil)
        user = RequestStore.store[:current_user]

        msg = log('DEBUG', message, class_name)

        if user.nil?
          @logger.error msg, options
        else
          Timber.with_context(user_context(user)) do
            @logger.error msg, options
          end
        end
      end

      private

      LEVEL = {
        INFO: :magenta,
        WARN: :yellow,
        ERROR: :red,
        DEBUG: :magenta
      }.freeze

      def log(level, msg, class_name)
        @class_name ||= class_name
        msg = if msg.is_a?(Hash)
                params = @filter.call(msg[:params])
                {
                  app_name: "[#{Paint[@app_name, :blue]}]",
                  class_name: @class_name.nil? ? nil : "[#{Paint[@class_name, :blue]}]",
                  level: "[#{Paint[level, LEVEL[level.to_sym]]}]",
                  date: "[#{Paint[Time.now.to_s, :cyan]}]",
                  msg: "#{msg[:http]} #{msg[:verb]} #{msg[:status]} #{msg[:ip]} #{msg[:path]} #{msg[:length]} #{params}"
                }
              else
                {
                  app_name: "[#{Paint[@app_name, :blue]}]",
                  class_name: @class_name.nil? ? nil : "[#{Paint[@class_name, :blue]}]",
                  level: "[#{Paint[level, LEVEL[level.to_sym]]}]",
                  date: "[#{Paint[Time.now.to_s, :cyan]}]",
                  msg: msg
                }
              end

        msg.reject { |_, v| v.nil? }.map { |_, v| v }.join(' ')
      end

      def user_context(user)
        Timber::Contexts::User.new id: user.id,
                                   email: user.email,
                                   name: user.name,
                                   meta: user.meta
      end
    end
  end
end