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
# File 'lib/lorekeeper/json_logger.rb', line 9

def initialize(file)
  reset_state
  @base_fields = { TIMESTAMP => '', MESSAGE => '', LEVEL => '' }

  super(file)
end

Instance Method Details

#add_fields(fields) ⇒ Object



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

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

#add_thread_unsafe_fields(fields) ⇒ Object



41
42
43
44
45
# File 'lib/lorekeeper/json_logger.rb', line 41

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



16
17
18
# File 'lib/lorekeeper/json_logger.rb', line 16

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



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/lorekeeper/json_logger.rb', line 68

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



94
95
96
# File 'lib/lorekeeper/json_logger.rb', line 94

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

#remove_fields(fields) ⇒ Object



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

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

#remove_thread_unsafe_fields(fields) ⇒ Object



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

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

#reset_stateObject



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

def reset_state
  Thread.current[THREAD_KEY] = nil
end

#stateObject



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

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

#write(message) ⇒ Object



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

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