Sha256: e1de4d9eac7eac88709d6b73c57cd6ed18ab6166f6eff806566a5416ee496347

Contents?: true

Size: 1.57 KB

Versions: 2

Compression:

Stored size: 1.57 KB

Contents

# frozen_string_literal: true

require "logger"
require "time"

module Sidekiq
  class Logger < ::Logger
    def initialize(*args)
      super

      self.formatter = Sidekiq.log_formatter
    end

    def with_context(hash)
      ctx.merge!(hash)
      yield
    ensure
      hash.keys.each { |key| ctx.delete(key) }
    end

    def ctx
      Thread.current[:sidekiq_context] ||= {}
    end

    module Formatters
      class Base < ::Logger::Formatter
        def tid
          Thread.current["sidekiq_tid"] ||= (Thread.current.object_id ^ ::Process.pid).to_s(36)
        end

        def ctx
          Thread.current[:sidekiq_context] ||= {}
        end

        def format_context
          " " + ctx.compact.map { |k, v| "#{k}=#{v}" }.join(" ") if ctx.any?
        end
      end

      class Pretty < Base
        def call(severity, time, program_name, message)
          "#{time.utc.iso8601(3)} pid=#{::Process.pid} tid=#{tid}#{format_context} #{severity}: #{message}\n"
        end
      end

      class WithoutTimestamp < Pretty
        def call(severity, time, program_name, message)
          "pid=#{::Process.pid} tid=#{tid}#{format_context} #{severity}: #{message}\n"
        end
      end

      class JSON < Base
        def call(severity, time, program_name, message)
          hash = {
            ts: time.utc.iso8601(3),
            pid: ::Process.pid,
            tid: tid,
            lvl: severity,
            msg: message,
          }
          c = ctx
          hash["ctx"] = c unless c.empty?

          Sidekiq.dump_json(hash) << "\n"
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
sidekiq-6.0.0 lib/sidekiq/logger.rb
sidekiq-6.0.0.pre1 lib/sidekiq/logger.rb