75 lines
1.6 KiB
Ruby
75 lines
1.6 KiB
Ruby
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
|