lib/lorekeeper/fast_logger.rb in lorekeeper-2.3.2 vs lib/lorekeeper/fast_logger.rb in lorekeeper-2.4.0
- old
+ new
@@ -1,15 +1,15 @@
# frozen_string_literal: true
require 'logger'
+require 'fiber'
module Lorekeeper
# Very simple, very fast logger
class FastLogger
include ::Logger::Severity # contains the levels constants: DEBUG, ERROR, etc.
- attr_accessor :level, # Current level, default: DEBUG
- :formatter # Just for compatibility with Logger, not used
+ attr_accessor :formatter # Just for compatibility with Logger, not used
def debug?; level <= DEBUG; end
def info?; level <= INFO; end
def warn?; level <= WARN; end
def error?; level <= ERROR; end
@@ -17,12 +17,35 @@
def initialize(file)
@level = DEBUG
@iodevice = LogDevice.new(file)
@file = file # We only keep this so we can inspect where we are sending the logs
+ @level_override = {}
end
+ def level
+ @level_override[Fiber.current] || @level
+ end
+
+ def level=(severity)
+ @level = coerce(severity)
+ end
+
+ def with_level(severity)
+ prev = level
+ @level_override[Fiber.current] = coerce(severity)
+ begin
+ yield
+ ensure
+ if prev
+ @level_override[Fiber.current] = prev
+ else
+ @level_override.delete(Fiber.current)
+ end
+ end
+ end
+
LOGGING_METHODS = %i[
debug
info
warn
error
@@ -53,11 +76,11 @@
end
end
# This is part of the standard Logger API, we need this to be compatible
def add(severity, message_param = nil, progname = nil, &block)
- return true if severity < @level
+ return true if severity < level
message = block&.call || message_param || progname
log_data(severity, message.freeze)
end
@@ -79,9 +102,15 @@
write(message)
end
def write(message)
@iodevice.write(message)
+ end
+
+ def coerce(severity)
+ return severity if severity.is_a?(Integer)
+
+ METHOD_SEVERITY_MAP[severity] || raise(ArgumentError, "invalid log level: #{severity}")
end
require 'monitor'
# Mutex to avoid broken lines when multiple threads access the log file
class LogDeviceMutex