Skip to content

Commit f1b0cc9

Browse files
committed
Improve formatting of the crash reports
1 parent 09b7dc6 commit f1b0cc9

File tree

4 files changed

+75
-2
lines changed

4 files changed

+75
-2
lines changed

lib/logger_json/formatters/elastic.ex

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,12 +219,31 @@ defmodule LoggerJSON.Formatters.Elastic do
219219
|> maybe_put(:"error.code", get_exception_code(exception))
220220
end
221221

222-
def format_crash_reason(message, {error, reason}, _meta) do
222+
def format_crash_reason(message, {{{%type{} = exception, _}, _}, stacktrace}, _meta) do
223+
formatted_stacktrace =
224+
[
225+
Exception.format_banner(:error, exception, stacktrace),
226+
Exception.format_stacktrace(stacktrace)
227+
]
228+
|> Enum.join("\n")
229+
230+
format_error_fields(message, Exception.message(exception), formatted_stacktrace, type)
231+
|> maybe_put(:"error.id", get_exception_id(exception))
232+
|> maybe_put(:"error.code", get_exception_code(exception))
233+
end
234+
235+
def format_crash_reason(message, {error, reason}, _meta) when is_atom(error) or is_binary(error) do
223236
stacktrace = "** (#{error}) #{inspect(reason)}"
224237
error_message = "#{error}: #{inspect(reason)}"
225238
format_error_fields(message, error_message, stacktrace, error)
226239
end
227240

241+
def format_crash_reason(message, {error, reason}, _meta) do
242+
stacktrace = "** (#{inspect(error)}) #{inspect(reason)}"
243+
error_message = "#{inspect(error)}: #{inspect(reason)}"
244+
format_error_fields(message, error_message, stacktrace, "error")
245+
end
246+
228247
defp get_exception_id(%{id: id}), do: id
229248
defp get_exception_id(_), do: nil
230249

lib/logger_json/formatters/google_cloud.ex

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,17 @@ defmodule LoggerJSON.Formatters.GoogleCloud do
188188
format_reported_error_event(message, ruby_stacktrace, service_context, meta)
189189
end
190190

191+
def format_crash_reason(message, {{{%{} = exception, _}, _}, stacktrace}, service_context, meta) do
192+
ruby_stacktrace =
193+
[
194+
Exception.format_banner(:error, exception, stacktrace),
195+
format_stacktrace(stacktrace)
196+
]
197+
|> Enum.join("\n")
198+
199+
format_reported_error_event(message, ruby_stacktrace, service_context, meta)
200+
end
201+
191202
def format_crash_reason(binary, {error, reason}, service_context, meta) when is_atom(error) or is_binary(error) do
192203
stacktrace = "** (#{error}) #{inspect(reason)}"
193204
format_reported_error_event(binary, stacktrace, service_context, meta)

test/logger_json/formatters/elastic_test.exs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,49 @@ defmodule LoggerJSON.Formatters.ElasticTest do
446446
assert String.starts_with?(stacktrace, "** (RuntimeError) oops")
447447
end
448448

449+
test "logs Task/GenServer termination" do
450+
test_pid = self()
451+
452+
logs =
453+
capture_log(fn ->
454+
{:ok, _} = Supervisor.start_link([{CrashingGenServer, :ok}], strategy: :one_for_one)
455+
456+
{:ok, _} =
457+
Task.start(fn ->
458+
try do
459+
GenServer.call(CrashingGenServer, :boom)
460+
catch
461+
_ -> nil
462+
after
463+
send(test_pid, :done)
464+
end
465+
end)
466+
467+
# Wait for task to finish
468+
receive do
469+
:done -> nil
470+
end
471+
472+
# Let logs flush
473+
Process.sleep(100)
474+
end)
475+
476+
[_, log_entry] =
477+
logs
478+
|> String.trim()
479+
|> String.split("\n")
480+
|> Enum.map(&decode_or_print_error/1)
481+
482+
assert %{
483+
"error.message" => "boom",
484+
"error.type" => "Elixir.RuntimeError",
485+
"error.stack_trace" => "** (RuntimeError) boom" <> _,
486+
"message" => message
487+
} = log_entry
488+
489+
assert message =~ ~r/Task #PID<\d+.\d+.\d+> started from #{inspect(test_pid)} terminating/
490+
end
491+
449492
test "passing options to encoder" do
450493
formatter = {Elastic, encoder_opts: [pretty: true]}
451494
:logger.update_handler_config(:default, :formatter, formatter)

test/logger_json/formatters/google_cloud_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ defmodule LoggerJSON.Formatters.GoogleCloudTest do
454454
assert %{
455455
"@type" => "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
456456
"message" => message,
457-
"stack_trace" => "** ({{%RuntimeError{message: \"boom\"}" <> _,
457+
"stack_trace" => "** (RuntimeError) boom" <> _,
458458
"serviceContext" => %{"service" => "nonode@nohost"}
459459
} = log_entry
460460

0 commit comments

Comments
 (0)