diff options
Diffstat (limited to 'lib/logger.rb')
-rw-r--r-- | lib/logger.rb | 52 |
1 files changed, 27 insertions, 25 deletions
diff --git a/lib/logger.rb b/lib/logger.rb index cbb0da676b..4099955ef2 100644 --- a/lib/logger.rb +++ b/lib/logger.rb @@ -10,6 +10,7 @@ # # A simple system for logging messages. See Logger for more documentation. +require 'fiber' require 'monitor' require 'rbconfig' @@ -107,7 +108,7 @@ require_relative 'logger/errors' # # - \Severity (one letter). # - Timestamp. -# - Timezone. +# - Process id. # - \Severity (word). # - Program name. # - Message. @@ -147,7 +148,7 @@ require_relative 'logger/errors' # when the entry is created. # # The logged timestamp is formatted by method -# {Time#strftime}[https://docs.ruby-lang.org/en/master/Time.html#method-i-strftime] +# {Time#strftime}[rdoc-ref:Time#strftime] # using this format string: # # '%Y-%m-%dT%H:%M:%S.%6N' @@ -264,8 +265,7 @@ require_relative 'logger/errors' # logger.error! # => 3 # logger.fatal! # => 4 # -# You can retrieve the log level with method -# {level}[Logger.html#attribute-i-level]: +# You can retrieve the log level with method #level. # # logger.level = Logger::ERROR # logger.level # => 3 @@ -365,7 +365,7 @@ require_relative 'logger/errors' # You can set a different format using create-time option # +shift_period_suffix+; # see details and suggestions at -# {Time#strftime}[https://docs.ruby-lang.org/en/master/Time.html#method-i-strftime]. +# {Time#strftime}[rdoc-ref:Time#strftime]. # class Logger _, name, rev = %w$Id$ @@ -380,7 +380,9 @@ class Logger include Severity # Logging severity threshold (e.g. <tt>Logger::INFO</tt>). - attr_reader :level + def level + @level_override[Fiber.current] || @level + end # Sets the log level; returns +severity+. # See {Log Level}[rdoc-ref:Logger@Log+Level]. @@ -395,24 +397,23 @@ class Logger # Logger#sev_threshold= is an alias for Logger#level=. # def level=(severity) - if severity.is_a?(Integer) - @level = severity - else - case severity.to_s.downcase - when 'debug' - @level = DEBUG - when 'info' - @level = INFO - when 'warn' - @level = WARN - when 'error' - @level = ERROR - when 'fatal' - @level = FATAL - when 'unknown' - @level = UNKNOWN + @level = Severity.coerce(severity) + end + + # Adjust the log level during the block execution for the current Fiber only + # + # logger.with_level(:debug) do + # logger.debug { "Hello" } + # end + def with_level(severity) + prev, @level_override[Fiber.current] = level, Severity.coerce(severity) + begin + yield + ensure + if prev + @level_override[Fiber.current] = prev else - raise ArgumentError, "invalid log level: #{severity}" + @level_override.delete(Fiber.current) end end end @@ -425,7 +426,7 @@ class Logger # Argument +datetime_format+ should be either of these: # # - A string suitable for use as a format for method - # {Time#strftime}[https://docs.ruby-lang.org/en/master/Time.html#method-i-strftime]. + # {Time#strftime}[rdoc-ref:Time#strftime]. # - +nil+: the logger uses <tt>'%Y-%m-%dT%H:%M:%S.%6N'</tt>. # def datetime_format=(datetime_format) @@ -453,7 +454,7 @@ class Logger # The proc should return a string containing the formatted entry. # # This custom formatter uses - # {String#dump}[https://docs.ruby-lang.org/en/master/String.html#method-i-dump] + # {String#dump}[rdoc-ref:String#dump] # to escape the message string: # # logger = Logger.new($stdout, progname: 'mung') @@ -583,6 +584,7 @@ class Logger self.datetime_format = datetime_format self.formatter = formatter @logdev = nil + @level_override = {} if logdev && logdev != File::NULL @logdev = LogDevice.new(logdev, shift_age: shift_age, shift_size: shift_size, |