Sha256: 699dd5c44a4de2d34bb03537c27353505f8628e5fedb5ffaafd7b97052ec66bb

Contents?: true

Size: 1.79 KB

Versions: 2

Compression:

Stored size: 1.79 KB

Contents

# frozen_string_literal: true

require 'logger'
require 'time'
require 'json'
require_relative 'formatter'
require_relative '../hash_extensions'
require_relative 'message'

module Twiglet
  class Logger < ::Logger
    Hash.include HashExtensions

    def initialize(
      service_name,
      default_properties: {},
      now: -> { Time.now.utc },
      output: $stdout,
      level: Logger::DEBUG
    )
      @service_name = service_name
      @now = now
      @output = output
      @level = level

      raise 'Service name is mandatory' \
        unless service_name.is_a?(String) && !service_name.strip.empty?

      @validator = Validator.from_file("#{__dir__}/validation_schema.json")

      @formatter = Twiglet::Formatter.new(
        service_name,
        default_properties: default_properties,
        now: now,
        validator: @validator
      )
      super(output, formatter: @formatter, level: level)
    end

    def configure_validation_error_response(&block)
      @validator.custom_error_handler = block
    end

    def error(message = nil, error = nil, &block)
      if error
        error_fields = {
          error: {
            type: error.class,
            message: error.message
          }
        }
        add_stack_trace(error_fields, error)
        message = Message.new(message).merge(error_fields)
      end

      super(message, &block)
    end

    def with(default_properties)
      Logger.new(
        @service_name,
        default_properties: default_properties,
        now: @now,
        output: @output,
        level: @level
      )
    end

    alias_method :warning, :warn
    alias_method :critical, :fatal

    private

    def add_stack_trace(hash_to_add_to, error)
      hash_to_add_to[:error][:stack_trace] = error.backtrace.join("\n") if error.backtrace
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
twiglet-3.1.2 lib/twiglet/logger.rb
twiglet-3.1.1 lib/twiglet/logger.rb