class ActiveJob::Logging::LogSubscriber

:nodoc:

def args_info(job)

def args_info(job)
  if job.arguments.any?
    " with arguments: " +
      job.arguments.map { |arg| format(arg).inspect }.join(", ")
  else
    ""
  end
end

def enqueue(event)

:nodoc:
def enqueue(event)
  info do
    job = event.payload[:job]
    "Enqueued #{job.class.name} (Job ID: #{job.job_id}) to #{queue_name(event)}" + args_info(job)
  end
end

def enqueue_at(event)

def enqueue_at(event)
  info do
    job = event.payload[:job]
    "Enqueued #{job.class.name} (Job ID: #{job.job_id}) to #{queue_name(event)} at #{scheduled_at(event)}" + args_info(job)
  end
end

def format(arg)

def format(arg)
  case arg
  when Hash
    arg.transform_values { |value| format(value) }
  when Array
    arg.map { |value| format(value) }
  when GlobalID::Identification
    arg.to_global_id rescue arg
  else
    arg
  end
end

def logger

def logger
  ActiveJob::Base.logger
end

def perform(event)

def perform(event)
  job = event.payload[:job]
  ex = event.payload[:exception_object]
  if ex
    error do
      "Error performing #{job.class.name} (Job ID: #{job.job_id}) from #{queue_name(event)} in #{event.duration.round(2)}ms: #{ex.class} (#{ex.message}):\n" + Array(ex.backtrace).join("\n")
    end
  else
    info do
      "Performed #{job.class.name} (Job ID: #{job.job_id}) from #{queue_name(event)} in #{event.duration.round(2)}ms"
    end
  end
end

def perform_start(event)

def perform_start(event)
  info do
    job = event.payload[:job]
    "Performing #{job.class.name} (Job ID: #{job.job_id}) from #{queue_name(event)}" + args_info(job)
  end
end

def queue_name(event)

def queue_name(event)
  event.payload[:adapter].class.name.demodulize.remove("Adapter") + "(#{event.payload[:job].queue_name})"
end

def scheduled_at(event)

def scheduled_at(event)
  Time.at(event.payload[:job].scheduled_at).utc
end