Class: SemanticLogger::Formatters::JsonTrunc

Inherits:
Raw
  • Object
show all
Defined in:
lib/appydays/loggable.rb

Overview

SemanticLogger Formatter that truncates large strings in the structured log payload. If the emitted JSON log is longer than max_message_len:

  • the payload is walked,

  • any strings with a length greater than max_string_len are shortened using shorten_string. Override shorten_string for custom behavior.

  • any key :stack_trace has its array truncated. Stack traces are very large, but contain short strings. Override truncate_stack_trace for custom behavior.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(max_message_len: 1024 * 3, max_string_len: 300, **args) ⇒ JsonTrunc

Returns a new instance of JsonTrunc.



44
45
46
47
48
# File 'lib/appydays/loggable.rb', line 44

def initialize(max_message_len: 1024 * 3, max_string_len: 300, **args)
  super(**args)
  @max_message_len = max_message_len
  @max_string_len = max_string_len
end

Instance Attribute Details

#max_message_lenObject

Returns the value of attribute max_message_len.



42
43
44
# File 'lib/appydays/loggable.rb', line 42

def max_message_len
  @max_message_len
end

#max_string_lenObject

Returns the value of attribute max_string_len.



42
43
44
# File 'lib/appydays/loggable.rb', line 42

def max_string_len
  @max_string_len
end

Instance Method Details

#call(log, logger) ⇒ Object



55
56
57
58
59
60
61
# File 'lib/appydays/loggable.rb', line 55

def call(log, logger)
  r = super
  rj = r.to_json
  return rj if rj.length <= @max_message_len
  rshort = self.trim_long_strings(r)
  return rshort.to_json
end

#shorten_string(v) ⇒ String

Given a long string, return the truncated string.

Parameters:

  • v (String)

Returns:

  • (String)


90
91
92
# File 'lib/appydays/loggable.rb', line 90

def shorten_string(v)
  return v[..@max_string_len] + "..."
end

#trim_long_strings(v) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/appydays/loggable.rb', line 63

def trim_long_strings(v)
  case v
    when Hash
      v.each_with_object({}) do |(hk, hv), memo|
        memo[hk] =
          if hk == :stack_trace && hv.is_a?(Array)
            self.truncate_stack_trace(hv)
          else
            self.trim_long_strings(hv)
          end
      end
    when Array
      v.map { |item| self.trim_long_strings(item) }
    when String
      if v.size > @max_string_len
        self.shorten_string(v)
      else
        v
      end
    else
      v
  end
end

#truncate_at(max_message_len, max_string_len) ⇒ Object



50
51
52
53
# File 'lib/appydays/loggable.rb', line 50

def truncate_at(max_message_len, max_string_len)
  @max_message_len = max_message_len
  @max_string_len = max_string_len
end

#truncate_stack_trace(arr) ⇒ Array

Given a stack trace array, return the array to log.

Parameters:

  • arr (Array)

Returns:

  • (Array)


97
98
99
100
# File 'lib/appydays/loggable.rb', line 97

def truncate_stack_trace(arr)
  return arr if arr.length <= 4
  return [arr[0], arr[1], "skipped #{arr.length - 4} frames", arr[-2], arr[-1]]
end