Class: Lorekeeper::JSONLogger

Inherits:
FastLogger show all
Defined in:
lib/lorekeeper/json_logger.rb

Overview

The JSONLogger provides a logger which will output messages in JSON format

Constant Summary

Constants inherited from FastLogger

FastLogger::LOGGING_METHODS, FastLogger::METHOD_SEVERITY_MAP, FastLogger::SEVERITY_NAMES_MAP

Instance Attribute Summary

Attributes inherited from FastLogger

#formatter

Instance Method Summary collapse

Methods inherited from FastLogger

#add, #coerce, #debug?, #error?, #fatal?, #info?, #level, #level=, #silence, #silence_logger, #warn?, #with_level

Constructor Details

#initialize(file) ⇒ JSONLogger

Returns a new instance of JSONLogger.



9
10
11
12
13
14
15
16
17
18
19
# File 'lib/lorekeeper/json_logger.rb', line 9

def initialize(file)
  reset_state
  @base_fields = { TIMESTAMP => '', MESSAGE => '', LEVEL => '' }
  @backtrace_cleaner = set_backtrace_cleaner
  @rails_root = defined?(Rails.root) ? Rails.root.to_s : nil
  @rails_root_size = @rails_root.to_s.size
  @gem_path = defined?(Gem.path) ? Gem.path : []
  @denylisted_fingerprint = denylisted_fingerprint

  super(file)
end

Instance Method Details

#add_fields(fields) ⇒ Object



59
60
61
62
# File 'lib/lorekeeper/json_logger.rb', line 59

def add_fields(fields)
  remove_invalid_fields(fields)
  state.fetch(:base_fields).merge!(fields)
end

#add_thread_unsafe_fields(fields) ⇒ Object



46
47
48
49
50
# File 'lib/lorekeeper/json_logger.rb', line 46

def add_thread_unsafe_fields(fields)
  remove_invalid_fields(fields)
  @base_fields.merge!(fields)
  reset_state # Forcing to recreate the thread safe information
end

#current_fieldsObject



21
22
23
# File 'lib/lorekeeper/json_logger.rb', line 21

def current_fields
  state[:base_fields]
end

#exception(exception, custom_message = nil, custom_data = nil, custom_level = :error, message: nil, data: nil, level: nil) ⇒ Object

By default message comes from exception.message Optional and named parameters to overwrite message, level and add data

Parameters:

  • exception:

    instance of a class inheriting from Exception



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

def exception(exception, custom_message = nil, custom_data = nil, custom_level = :error,
  message: nil, data: nil, level: nil) # Backwards compatible named params

  param_level = level || custom_level
  param_data = data || custom_data
  param_message = message || custom_message

  log_level = METHOD_SEVERITY_MAP[param_level] || ERROR

  if exception.is_a?(Exception)
    backtrace = clean_backtrace(exception.backtrace || [])
    exception_fields = {
      EXCEPTION => "#{exception.class}: #{exception.message}",
      STACK => backtrace
    }
    exception_fields[DATA] = param_data if param_data

    message = param_message || exception.message
    with_extra_fields(exception_fields) { log_data(log_level, message) }
  else
    log_data(METHOD_SEVERITY_MAP[:warn], 'Logger exception called without exception class.')
    message = "#{exception.class}: #{exception.inspect} #{param_message}"
    with_extra_fields(DATA => (param_data || {})) { log_data(log_level, message) }
  end
end

#inspectObject



99
100
101
# File 'lib/lorekeeper/json_logger.rb', line 99

def inspect
  "Lorekeeper JSON logger. IO: #{@file.inspect}"
end

#remove_fields(fields) ⇒ Object



64
65
66
67
68
# File 'lib/lorekeeper/json_logger.rb', line 64

def remove_fields(fields)
  [*fields].each do |field|
    state.fetch(:base_fields).delete(field)
  end
end

#remove_thread_unsafe_fields(fields) ⇒ Object



52
53
54
55
56
57
# File 'lib/lorekeeper/json_logger.rb', line 52

def remove_thread_unsafe_fields(fields)
  [*fields].each do |field|
    @base_fields.delete(field)
  end
  reset_state
end

#reset_stateObject



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

def reset_state
  Thread.current[THREAD_KEY] = nil
end

#stateObject



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

def state
  Thread.current[THREAD_KEY] ||= { base_fields: @base_fields.dup, extra_fields: {} }
end

#write(message) ⇒ Object



103
104
105
# File 'lib/lorekeeper/json_logger.rb', line 103

def write(message)
  super(json_message(message) << "\n")
end