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