1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
# frozen_string_literal: true
module Sidekiq
class JobLogger
def initialize(config)
@config = config
@logger = @config.logger
end
# If true we won't do any job logging out of the box.
# The user is responsible for any logging.
def skip_default_logging?
@config[:skip_default_job_logging]
end
def call(item, queue)
return yield if skip_default_logging?
begin
start = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
@logger.info("start")
yield
Sidekiq::Context.add(:elapsed, elapsed(start))
@logger.info("done")
rescue Exception
Sidekiq::Context.add(:elapsed, elapsed(start))
@logger.info("fail")
raise
end
end
def prepare(job_hash, &block)
# If we're using a wrapper class, like ActiveJob, use the "wrapped"
# attribute to expose the underlying thing.
h = {
class: job_hash["display_class"] || job_hash["wrapped"] || job_hash["class"],
jid: job_hash["jid"]
}
h[:bid] = job_hash["bid"] if job_hash.has_key?("bid")
h[:tags] = job_hash["tags"] if job_hash.has_key?("tags")
Thread.current[:sidekiq_context] = h
level = job_hash["log_level"]
if level && @logger.respond_to?(:log_at)
@logger.log_at(level, &block)
else
yield
end
ensure
Thread.current[:sidekiq_context] = nil
end
private
def elapsed(start)
(::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - start).round(3)
end
end
end
|