class Cloudtasker::WorkerLogger
Add contextual information to logs generated by workers
Constants
- DEFAULT_CONTEXT_PROCESSOR
Only log the job meta information by default (exclude arguments)
Attributes
Public Class Methods
Build a new instance of the class.
@param [Cloudtasker::Worker] worker The worker.
# File lib/cloudtasker/worker_logger.rb, line 21 def initialize(worker) @worker = worker end
Public Instance Methods
Return the Proc responsible for formatting the log payload.
@return [Proc] The context processor.
# File lib/cloudtasker/worker_logger.rb, line 30 def context_processor @context_processor ||= worker.class.cloudtasker_options_hash[:log_context_processor] || self.class.log_context_processor || DEFAULT_CONTEXT_PROCESSOR end
Log an debut message.
@param [String] msg The message to log. @param [Proc] &block Optional context block.
# File lib/cloudtasker/worker_logger.rb, line 126 def debug(msg, &block) log_message(:debug, msg, &block) end
Log an error message.
@param [String] msg The message to log. @param [Proc] &block Optional context block.
# File lib/cloudtasker/worker_logger.rb, line 106 def error(msg, &block) log_message(:error, msg, &block) end
Log an fatal message.
@param [String] msg The message to log. @param [Proc] &block Optional context block.
# File lib/cloudtasker/worker_logger.rb, line 116 def fatal(msg, &block) log_message(:fatal, msg, &block) end
Format main log message.
@param [String] msg The message to log.
@return [String] The formatted log message
# File lib/cloudtasker/worker_logger.rb, line 81 def formatted_message(msg) if msg.is_a?(String) formatted_message_as_string(msg) else # Delegate object formatting to logger msg end end
Format the log message as string.
@param [Object] msg The log message or object.
@return [String] The formatted message
# File lib/cloudtasker/worker_logger.rb, line 61 def formatted_message_as_string(msg) # Format message msg_content = if msg.is_a?(Exception) [msg.inspect, msg.backtrace].flatten(1).join("\n") elsif msg.is_a?(String) msg else msg.inspect end "[Cloudtasker][#{worker.class}][#{worker.job_id}] #{msg_content}" end
Log an info message.
@param [String] msg The message to log. @param [Proc] &block Optional context block.
# File lib/cloudtasker/worker_logger.rb, line 96 def info(msg, &block) log_message(:info, msg, &block) end
The block to pass to log messages.
@return [Proc] The log block.
# File lib/cloudtasker/worker_logger.rb, line 41 def log_block @log_block ||= proc { context_processor.call(worker) } end
Return the Cloudtasker
logger.
@return [Logger, any] The cloudtasker logger.
# File lib/cloudtasker/worker_logger.rb, line 50 def logger Cloudtasker.logger end
Delegate all methods to the underlying logger.
@param [String, Symbol] name The method to delegate. @param [Array<any>] *args The list of method arguments. @param [Proc] &block Block passed to the method.
@return [Any] The method return value
# File lib/cloudtasker/worker_logger.rb, line 139 def method_missing(name, *args, &block) if logger.respond_to?(name) logger.send(name, *args, &block) else super end end
Check if the class respond to a certain method.
@param [String, Symbol] name The name of the method. @param [Boolean] include_private Whether to check private methods or not. Default to false.
@return [Boolean] Return true if the class respond to this method.
# File lib/cloudtasker/worker_logger.rb, line 155 def respond_to_missing?(name, include_private = false) logger.respond_to?(name) || super end
Private Instance Methods
Log a message for the provided log level.
@param [String, Symbol] level The log level @param [String] msg The message to log. @param [Proc] &block Optional context block.
# File lib/cloudtasker/worker_logger.rb, line 168 def log_message(level, msg, &block) # Merge log-specific context into worker-specific context payload_block = ->(*_args) { log_block.call.merge(block&.call || {}) } # ActiveSupport::Logger does not support passing a payload through a block on top # of a message. if defined?(ActiveSupport::Logger) && logger.is_a?(ActiveSupport::Logger) # The logger is fairly basic in terms of formatting. All inputs get converted # as regular strings. logger.send(level) { "#{formatted_message_as_string(msg)} -- #{payload_block.call}" } else logger.send(level, formatted_message(msg), &payload_block) end end