class LogStasher::LogFormatter

Attributes

base_tags[R]
release[R]
root_dir[R]

Public Class Methods

new(base_tags = [], root_dir = nil) click to toggle source
# File lib/logstasher/log_formatter.rb, line 9
def initialize(base_tags = [], root_dir = nil)
  @base_tags = Array(base_tags)
  @root_dir = root_dir
  @release = $1 if root_dir && root_dir =~ /releases\/([^\/]+)/
end

Public Instance Methods

call(severity, datetime, progname, message) click to toggle source
# File lib/logstasher/log_formatter.rb, line 15
def call(severity, datetime, progname, message)
  event = {
    '@timestamp' => datetime.utc,
    '@version' => '1',
    severity: severity.downcase,
  }.merge(format(message))

  event.merge!(format(progname)) if progname.is_a?(Exception)
  event[:tags] = base_tags + Array(event[:tags])
  JSON.generate(event) + "\n"
end
format(data) click to toggle source
# File lib/logstasher/log_formatter.rb, line 27
def format(data)
  return { message: data } if data.is_a?(String)
  return format_exception(data) if data.is_a?(Exception)
  return format_hash(data) if data.is_a?(Hash)
  fail ArgumentError, "Not expected type of log message: #{data} (#{data.class})"
end

Private Instance Methods

error_source(exception) click to toggle source
# File lib/logstasher/log_formatter.rb, line 77
def error_source(exception)
  source = exception.backtrace.find { |line| line.match(/\A#{root_dir}/) }
  source.sub(/\A#{root_dir}/, '') if source
end
filter_parameters(data) click to toggle source
# File lib/logstasher/log_formatter.rb, line 49
def filter_parameters(data)
  return data unless data[:params]

  # We override fields, don't want to risk mutating params object!
  filtered_data = data.dup

  LogStasher.filter_parameters.each do |param|
    filtered_data[:params][param] = '[FILTERED]' unless filtered_data[:params][param].nil?
  end

  filtered_data
end
format_exception(exception) click to toggle source
# File lib/logstasher/log_formatter.rb, line 62
def format_exception(exception)
  result = {
    tags: 'exception',
    error_class: exception.class.to_s,
    error_message: exception.message,
    error_source: error_source(exception),
    error_backtrace: exception.backtrace,
  }

  if exception.respond_to?(:cause) && exception.cause
    result[:error_cause] = [exception.cause.class.to_s, exception.cause.message].concat(exception.cause.backtrace)
  end
  result
end
format_hash(data) click to toggle source
# File lib/logstasher/log_formatter.rb, line 36
def format_hash(data)
  formatted_data = filter_parameters(data)

  # logstash overrides the path attribute
  formatted_data.merge!(request_path: formatted_data[:path]) if formatted_data[:path]

  if formatted_data[:exception]
    format_exception(formatted_data.delete(:exception)).merge(formatted_data)
  else
    formatted_data
  end
end