summaryrefslogtreecommitdiff
path: root/lib/logger.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/logger.rb')
-rw-r--r--lib/logger.rb52
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,