2019-09-13 14:53:29 -04:00
# frozen_string_literal: true
require " active_support/log_subscriber "
module ActiveJob
class LogSubscriber < ActiveSupport :: LogSubscriber #:nodoc:
def enqueue ( event )
2019-11-28 17:40:24 -05:00
job = event . payload [ :job ]
ex = event . payload [ :exception_object ]
if ex
error do
2019-12-16 18:46:04 -05:00
" Failed enqueuing #{ job . class . name } to #{ queue_name ( event ) } : #{ ex . class } ( #{ ex . message } ) "
2019-11-28 17:40:24 -05:00
end
elsif event . payload [ :aborted ]
info do
" Failed enqueuing #{ job . class . name } to #{ queue_name ( event ) } , a before_enqueue callback halted the enqueuing execution. "
end
else
info do
" Enqueued #{ job . class . name } (Job ID: #{ job . job_id } ) to #{ queue_name ( event ) } " + args_info ( job )
end
2019-09-13 14:53:29 -04:00
end
end
def enqueue_at ( event )
2019-11-28 17:40:24 -05:00
job = event . payload [ :job ]
ex = event . payload [ :exception_object ]
if ex
error do
2019-12-16 18:46:04 -05:00
" Failed enqueuing #{ job . class . name } to #{ queue_name ( event ) } : #{ ex . class } ( #{ ex . message } ) "
2019-11-28 17:40:24 -05:00
end
elsif event . payload [ :aborted ]
info do
" Failed enqueuing #{ job . class . name } to #{ queue_name ( event ) } , a before_enqueue callback halted the enqueuing execution. "
end
else
info do
" Enqueued #{ job . class . name } (Job ID: #{ job . job_id } ) to #{ queue_name ( event ) } at #{ scheduled_at ( event ) } " + args_info ( job )
end
2019-09-13 14:53:29 -04:00
end
end
def perform_start ( event )
info do
job = event . payload [ :job ]
" Performing #{ job . class . name } (Job ID: #{ job . job_id } ) from #{ queue_name ( event ) } enqueued at #{ job . enqueued_at } " + args_info ( job )
end
end
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
2019-11-28 17:40:24 -05:00
elsif event . payload [ :aborted ]
error do
" Error performing #{ job . class . name } (Job ID: #{ job . job_id } ) from #{ queue_name ( event ) } in #{ event . duration . round ( 2 ) } ms: a before_perform callback halted the job execution "
end
2019-09-13 14:53:29 -04:00
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 enqueue_retry ( event )
job = event . payload [ :job ]
ex = event . payload [ :error ]
wait = event . payload [ :wait ]
info do
if ex
" Retrying #{ job . class } in #{ wait . to_i } seconds, due to a #{ ex . class } . "
else
" Retrying #{ job . class } in #{ wait . to_i } seconds. "
end
end
end
def retry_stopped ( event )
job = event . payload [ :job ]
ex = event . payload [ :error ]
error do
" Stopped retrying #{ job . class } due to a #{ ex . class } , which reoccurred on #{ job . executions } attempts. "
end
end
def discard ( event )
job = event . payload [ :job ]
ex = event . payload [ :error ]
error do
" Discarded #{ job . class } due to a #{ ex . class } . "
end
end
private
def queue_name ( event )
event . payload [ :adapter ] . class . name . demodulize . remove ( " Adapter " ) + " ( #{ event . payload [ :job ] . queue_name } ) "
end
def args_info ( job )
2019-11-07 14:06:06 -05:00
if job . class . log_arguments? && job . arguments . any?
2019-09-13 14:53:29 -04:00
" with arguments: " +
job . arguments . map { | arg | format ( arg ) . inspect } . join ( " , " )
else
" "
end
end
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 scheduled_at ( event )
Time . at ( event . payload [ :job ] . scheduled_at ) . utc
end
def logger
ActiveJob :: Base . logger
end
end
end
ActiveJob :: LogSubscriber . attach_to :active_job