lib/berkeley_library/logging/formatters.rb in berkeley_library-logging-0.2.0 vs lib/berkeley_library/logging/formatters.rb in berkeley_library-logging-0.2.1

- old
+ new

@@ -8,11 +8,11 @@ def new_json_formatter Bunyan.new end def new_readable_formatter - Ougai::Formatters::Readable.new + Readable.new end def lograge_formatter ->(data) { { msg: 'Request', request: Formatters.ensure_hash(data) } } end @@ -26,11 +26,56 @@ end # ------------------------------------------------------------ # Private helper classes + module ErrorCauseSerializer + def serialize_exc(ex, serialized = Set.new) + super(ex).tap do |result| + next unless (cause = ex.cause) + next if (serialized << ex).include?(cause) # prevent circular references + + result[:cause] = serialize_exc(cause, serialized) + end + end + end + + private_constant :ErrorCauseSerializer + + class Readable < Ougai::Formatters::Readable + include ErrorCauseSerializer + + protected + + def create_err_str(data) + return unless (err_hash = data.delete(:err)) + + format_err(err_hash) + end + + private + + def format_err(err_hash) + " #{err_hash[:name]} (#{err_hash[:message]}):".tap do |msg| + next unless (stack = err_hash[:stack]) + + msg << "\n" + msg << (' ' * @trace_indent) + msg << stack + + next unless (cause_hash = err_hash[:cause]) + + msg << "\n Caused by: " + msg << format_err(cause_hash).strip + end + end + + end + private_constant :Readable + class Bunyan < Ougai::Formatters::Bunyan include Ougai::Logging::Severity + include ErrorCauseSerializer def _call(severity, time, progname, data) original_data = Formatters.ensure_hash(data) # Ougai::Formatters::Bunyan replaces the human-readable severity string