Files
redux-scraper/app/lib/color_logger.rb
2025-01-01 03:29:53 +00:00

76 lines
1.6 KiB
Ruby

# typed: false
class ColorLogger
@quiet = Concurrent::ThreadLocalVar.new { 0 }
def self.quiet
@quiet.value += 1
yield
ensure
@quiet.value -= 1
end
def self.unquiet
saved = @quiet.value
@quiet.value = 0
yield
ensure
@quiet.value = saved
end
def self.make(sink, instance = nil)
# clean up common class names
if instance
klass_name = klass_name_from_instance(instance)
else
klass_name = "(Anonymous)"
end
logger =
Logger
.new(sink)
.tap do |logger|
prefix = ""
logger.define_singleton_method :prefix= do |p|
prefix = p
end
logger.define_singleton_method :sink do
sink
end
logger.formatter =
proc do |severity, datetime, progname, msg|
color =
case severity
when "ERROR"
:red
when "WARN"
:yellow
else
:light_blue
end
klass_name_str = "[#{klass_name.send(color)}]".ljust(32)
prefix = prefix.call if prefix.is_a?(Proc)
if @quiet.value > 0
""
else
[klass_name_str, prefix, msg].reject(&:blank?).join(" ") + "\n"
end
end
end
ActiveSupport::TaggedLogging.new(logger)
end
def self.klass_name_from_instance(instance)
if instance.is_a?(String)
klass_name = instance.dup
else
klass_name = instance.class.name.dup
end
klass_name.delete_prefix!("Domain::")
klass_name
end
end