Skip to content

Instantly share code, notes, and snippets.

@jackwillis
Last active December 18, 2025 17:09
Show Gist options
  • Select an option

  • Save jackwillis/c5b67f4aa85c206473bc0dc603c01730 to your computer and use it in GitHub Desktop.

Select an option

Save jackwillis/c5b67f4aa85c206473bc0dc603c01730 to your computer and use it in GitHub Desktop.
loggable.rb
require "logger"
module Loggable
attr_accessor :logger
def initialize(*args, logger: nil, **options, &block)
@logger = logger || default_logger
super(*args, **options, &block)
end
protected
def default_logger
Logger.new(default_logger_io).tap do |log|
log.progname = default_logger_progname
log.formatter = default_logger_formatter
end
end
def default_logger_io
$stdout
end
def default_logger_progname
self.class.name
end
def default_logger_formatter
proc do |severity, datetime, progname, msg|
tid = Thread.current.name || Thread.current.native_thread_id
thread_info = Thread.list.size > 1 ? "[T:#{tid}]" : ""
"[#{datetime}] #{severity} #{progname}#{thread_info} -- #{msg}\n"
end
end
end
require_relative "loggable"
# Now you can do:
class OrderProcessor
prepend Loggable
def initialize(order_id)
@order_id = order_id
logger.info { "Processing order ##{@order_id}" }
end
end
# Default logger
OrderProcessor.new(42)
# Custom loggers
OrderProcessor.new(42, logger: Rails.logger)
OrderProcessor.new(42, logger: Logger.new("orders.log"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment