Class: Prefab::LoggerClient

Inherits:
Logger
  • Object
show all
Defined in:
lib/prefab/logger_client.rb

Constant Summary collapse

SEP =
'.'
BASE_KEY =
'log-level'
UNKNOWN_PATH =
'unknown.'
LOG_TAGS =
'log.tags'
REQ_TAGS =
'req.tags'
LOG_LEVEL_LOOKUPS =
{
  PrefabProto::LogLevel::NOT_SET_LOG_LEVEL => ::Logger::DEBUG,
  PrefabProto::LogLevel::TRACE => ::Logger::DEBUG,
  PrefabProto::LogLevel::DEBUG => ::Logger::DEBUG,
  PrefabProto::LogLevel::INFO => ::Logger::INFO,
  PrefabProto::LogLevel::WARN => ::Logger::WARN,
  PrefabProto::LogLevel::ERROR => ::Logger::ERROR,
  PrefabProto::LogLevel::FATAL => ::Logger::FATAL
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(logdev, log_path_aggregator: nil, formatter: Options::DEFAULT_LOG_FORMATTER, prefix: nil) ⇒ LoggerClient

Returns a new instance of LoggerClient.



25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/prefab/logger_client.rb', line 25

def initialize(logdev, log_path_aggregator: nil, formatter: Options::DEFAULT_LOG_FORMATTER, prefix: nil)
  super(logdev)
  self.formatter = Prefab::Logging::FormatterBase.new(formatter_proc: formatter, logger_client: self)
  @config_client = BootstrappingConfigClient.new
  @silences = Concurrent::Map.new(initial_capacity: 2)
  @recurse_check = Concurrent::Map.new(initial_capacity: 2)
  @prefix = "#{prefix}#{prefix && '.'}"

  @context_keys_map = Concurrent::Map.new(initial_capacity: 4)

  @log_path_aggregator = log_path_aggregator
  @@shared_instance = self
end

Class Method Details

.instanceObject



21
22
23
# File 'lib/prefab/logger_client.rb', line 21

def self.instance
  @@shared_instance ||= LoggerClient.new($stdout)
end

Instance Method Details

#add_context_keys(*keys) ⇒ Object



39
40
41
# File 'lib/prefab/logger_client.rb', line 39

def add_context_keys(*keys)
  context_keys.merge(keys)
end

#add_internal(severity, message, progname, loc, log_context = {}, &block) ⇒ Object

InternalLoggers Will Call This



59
60
61
62
63
64
# File 'lib/prefab/logger_client.rb', line 59

def add_internal(severity, message, progname, loc, log_context = {}, &block)
  path_loc = get_loc_path(loc)
  path = @prefix + path_loc

  log(message, path, progname, severity, log_context, &block)
end

#config_client=(config_client) ⇒ Object



176
177
178
# File 'lib/prefab/logger_client.rb', line 176

def config_client=(config_client)
  @config_client = config_client
end

#context_keysObject



54
55
56
# File 'lib/prefab/logger_client.rb', line 54

def context_keys
  @context_keys_map.fetch_or_store(local_log_id, Concurrent::Set.new)
end

#current_tagsObject



167
168
169
# File 'lib/prefab/logger_client.rb', line 167

def current_tags
  Prefab::Context.current.get(LOG_TAGS) || []
end

#debug(progname = nil, **log_context, &block) ⇒ Object



104
105
106
# File 'lib/prefab/logger_client.rb', line 104

def debug(progname = nil, **log_context, &block)
  add_internal(DEBUG, nil, progname, caller_locations(1, 1)[0], log_context, &block)
end

#debug?Boolean

Returns:

  • (Boolean)


124
125
126
# File 'lib/prefab/logger_client.rb', line 124

def debug?
  true
end

#error(progname = nil, **log_context, &block) ⇒ Object



116
117
118
# File 'lib/prefab/logger_client.rb', line 116

def error(progname = nil, **log_context, &block)
  add_internal(ERROR, nil, progname, caller_locations(1, 1)[0], log_context, &block)
end

#error?Boolean

Returns:

  • (Boolean)


136
137
138
# File 'lib/prefab/logger_client.rb', line 136

def error?
  true
end

#fatal(progname = nil, **log_context, &block) ⇒ Object



120
121
122
# File 'lib/prefab/logger_client.rb', line 120

def fatal(progname = nil, **log_context, &block)
  add_internal(FATAL, nil, progname, caller_locations(1, 1)[0], log_context, &block)
end

#fatal?Boolean

Returns:

  • (Boolean)


140
141
142
# File 'lib/prefab/logger_client.rb', line 140

def fatal?
  true
end

#flushObject



171
172
173
174
# File 'lib/prefab/logger_client.rb', line 171

def flush
  Prefab::Context.current.set("req", {"tags": nil})
  super if defined?(super)
end

#info(progname = nil, **log_context, &block) ⇒ Object



108
109
110
# File 'lib/prefab/logger_client.rb', line 108

def info(progname = nil, **log_context, &block)
  add_internal(INFO, nil, progname, caller_locations(1, 1)[0], log_context, &block)
end

#info?Boolean

Returns:

  • (Boolean)


128
129
130
# File 'lib/prefab/logger_client.rb', line 128

def info?
  true
end

#internal_logger(path = nil) ⇒ Object



50
51
52
# File 'lib/prefab/logger_client.rb', line 50

def internal_logger(path = nil)
  InternalLogger.new(path, self)
end

#levelObject



144
145
146
# File 'lib/prefab/logger_client.rb', line 144

def level
  DEBUG
end

#local_log_idObject



180
181
182
# File 'lib/prefab/logger_client.rb', line 180

def local_log_id
  Thread.current.__id__
end

#log(message, path, progname, severity, log_context = {}) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/prefab/logger_client.rb', line 76

def log(message, path, progname, severity, log_context = {})
  severity ||= ::Logger::UNKNOWN

  return true if !should_log? severity, path
  return true if @logdev.nil? || @silences[local_log_id]

  progname = @progname if progname.nil?

  if message.nil?
    if block_given?
      message = yield
    else
      message = progname
      progname = @progname
    end
  end

  @logdev.write(
    format_message(format_severity(severity), Time.now, progname, message, path, stringify_keys(log_context.merge(fetch_context_for_context_keys)))
  )
  true
end

#log_internal(severity, message, path, log_context = {}, &block) ⇒ Object



66
67
68
69
70
71
72
73
74
# File 'lib/prefab/logger_client.rb', line 66

def log_internal(severity, message, path, log_context = {}, &block)
  return if @recurse_check[local_log_id]
  @recurse_check[local_log_id] = true
  begin
    log(message, path, nil, severity, log_context, &block)
  ensure
    @recurse_check[local_log_id] = false
  end
end

#should_log?(severity, path) ⇒ Boolean

Returns:

  • (Boolean)


99
100
101
102
# File 'lib/prefab/logger_client.rb', line 99

def should_log?(severity, path)
  @log_path_aggregator&.push(path, severity)
  severity >= level_of(path)
end

#silenceObject



184
185
186
187
188
189
# File 'lib/prefab/logger_client.rb', line 184

def silence
  @silences[local_log_id] = true
  yield self
ensure
  @silences[local_log_id] = false
end

#tagged(*tags) ⇒ Object



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/prefab/logger_client.rb', line 148

def tagged(*tags)
  to_add = tags.flatten.compact
  if block_given?
    new_log_tags = current_tags
    new_log_tags += to_add unless to_add.empty?
    Prefab::Context.with_merged_context({ "log" => { "tags" => new_log_tags } }) do
      with_context_keys LOG_TAGS do
        yield self
      end
    end
  else
    new_log_tags = Prefab::Context.current.get(REQ_TAGS) || []
    new_log_tags += to_add unless to_add.empty?
    add_context_keys REQ_TAGS
    Prefab::Context.current.set("req", {"tags": new_log_tags})
    self
  end
end

#warn(progname = nil, **log_context, &block) ⇒ Object



112
113
114
# File 'lib/prefab/logger_client.rb', line 112

def warn(progname = nil, **log_context, &block)
  add_internal(WARN, nil, progname, caller_locations(1, 1)[0], log_context, &block)
end

#warn?Boolean

Returns:

  • (Boolean)


132
133
134
# File 'lib/prefab/logger_client.rb', line 132

def warn?
  true
end

#with_context_keys(*keys) ⇒ Object



43
44
45
46
47
48
# File 'lib/prefab/logger_client.rb', line 43

def with_context_keys(*keys)
  context_keys.merge(keys)
  yield
ensure
  context_keys.subtract(keys)
end