Class: Lorekeeper::FastLogger

Inherits:
Object
  • Object
show all
Includes:
Logger::Severity
Defined in:
lib/lorekeeper/fast_logger.rb

Overview

Very simple, very fast logger

Direct Known Subclasses

JSONLogger, SimpleLogger

Constant Summary collapse

LOGGING_METHODS =
i[
  debug
  info
  warn
  error
  fatal
].freeze
METHOD_SEVERITY_MAP =
{
  debug: DEBUG,
  info: INFO,
  warn: WARN,
  error: ERROR,
  fatal: FATAL
}.freeze
SEVERITY_NAMES_MAP =
{
  DEBUG => 'debug',
  INFO => 'info',
  WARN => 'warning',
  ERROR => 'error',
  FATAL => 'fatal'
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(file) ⇒ FastLogger

Returns a new instance of FastLogger.



18
19
20
21
22
23
# File 'lib/lorekeeper/fast_logger.rb', line 18

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

Instance Attribute Details

#formatterObject

Just for compatibility with Logger, not used



10
11
12
# File 'lib/lorekeeper/fast_logger.rb', line 10

def formatter
  @formatter
end

Instance Method Details

#add(severity, message_param = nil, progname = nil, &block) ⇒ Object

This is part of the standard Logger API, we need this to be compatible



80
81
82
83
84
85
# File 'lib/lorekeeper/fast_logger.rb', line 80

def add(severity, message_param = nil, progname = nil, &block)
  return true if severity < level

  message = block&.call || message_param || progname
  log_data(severity, message.freeze)
end

#coerce(severity) ⇒ Object



109
110
111
112
113
# File 'lib/lorekeeper/fast_logger.rb', line 109

def coerce(severity)
  return severity if severity.is_a?(Integer)

  METHOD_SEVERITY_MAP[severity] || raise(ArgumentError, "invalid log level: #{severity}")
end

#debug?Boolean

Returns:

  • (Boolean)


12
# File 'lib/lorekeeper/fast_logger.rb', line 12

def debug?; level <= DEBUG; end

#error?Boolean

Returns:

  • (Boolean)


15
# File 'lib/lorekeeper/fast_logger.rb', line 15

def error?; level <= ERROR; end

#fatal?Boolean

Returns:

  • (Boolean)


16
# File 'lib/lorekeeper/fast_logger.rb', line 16

def fatal?; level <= FATAL; end

#info?Boolean

Returns:

  • (Boolean)


13
# File 'lib/lorekeeper/fast_logger.rb', line 13

def info?; level <= INFO; end

#levelObject



25
26
27
# File 'lib/lorekeeper/fast_logger.rb', line 25

def level
  @level_override[Fiber.current] || @level
end

#level=(severity) ⇒ Object



29
30
31
# File 'lib/lorekeeper/fast_logger.rb', line 29

def level=(severity)
  @level = coerce(severity)
end

#log_data(_severity, message) ⇒ Object

inherited classes probably want to reimplement this



101
102
103
# File 'lib/lorekeeper/fast_logger.rb', line 101

def log_data(_severity, message)
  write(message)
end

#silence(&block) ⇒ Object

activerecord-session_store v2 is now simply calling silence instead of silence_logger



96
97
98
# File 'lib/lorekeeper/fast_logger.rb', line 96

def silence(&block)
  yield if block
end

#silence_logger(&block) ⇒ Object

Some gems like to add this method. For instance: github.com/rails/activerecord-session_store To avoid needing to monkey-patch Lorekeeper just to get this method, we are adding a simple non-functional version here.



91
92
93
# File 'lib/lorekeeper/fast_logger.rb', line 91

def silence_logger(&block)
  yield if block
end

#warn?Boolean

Returns:

  • (Boolean)


14
# File 'lib/lorekeeper/fast_logger.rb', line 14

def warn?; level <= WARN; end

#with_level(severity) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/lorekeeper/fast_logger.rb', line 33

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

#write(message) ⇒ Object



105
106
107
# File 'lib/lorekeeper/fast_logger.rb', line 105

def write(message)
  @iodevice.write(message)
end