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