Skip to content

Commit 6c0cbbd

Browse files
committed
Handle :undefined arity in Logger.Translator
We get :undefined when a temporary worker of a simple_one_for_one supervisor crashes. Thanks to @fishcakez for feedback
1 parent d58ef57 commit 6c0cbbd

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

lib/logger/lib/logger/translator.ex

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,12 +162,12 @@ defmodule Logger.Translator do
162162
defp sup_context(:shutdown_error), do: "shutdown abnormally"
163163

164164
defp child_info(min_level, [{:mfargs, {mod, fun, args}} | debug]) do
165-
["Start Call: ", Exception.format_mfa(mod, fun, args) |
165+
["Start Call: ", format_mfa(mod, fun, args) |
166166
child_debug(min_level, debug)]
167167
end
168168

169169
defp child_info(min_level, [{:mfa, {mod, fun, args}} | debug]) do
170-
["Start Call: ", Exception.format_mfa(mod, fun, args) |
170+
["Start Call: ", format_mfa(mod, fun, args) |
171171
child_debug(min_level, debug)]
172172
end
173173

@@ -248,11 +248,11 @@ defmodule Logger.Translator do
248248
end
249249

250250
defp crash_call(mod, fun, arity) when is_integer(arity) do
251-
Exception.format_mfa(mod, fun, arity)
251+
format_mfa(mod, fun, arity)
252252
end
253253

254254
defp crash_call(mod, fun, args) do
255-
Exception.format_mfa(mod, fun, length(args))
255+
format_mfa(mod, fun, length(args))
256256
end
257257

258258
defp crash_debug(:debug,
@@ -295,4 +295,6 @@ defmodule Logger.Translator do
295295
crash_info(min_level, info, [prefix | prefix])]
296296
end
297297

298+
defp format_mfa(mod, fun, :undefined), do: [inspect(mod), ?., to_string(fun) | "/?"]
299+
defp format_mfa(mod, fun, args), do: Exception.format_mfa(mod, fun, args)
298300
end

lib/logger/test/logger/translator_test.exs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ defmodule Logger.TranslatorTest do
3131
end
3232
end
3333

34+
defmodule MyTemporaryWorker do
35+
use GenServer
36+
def start_link, do: GenServer.start_link(__MODULE__, [], [])
37+
def init([]), do: 1 / 0
38+
end
39+
3440
setup_all do
3541
sasl_reports? = Application.get_env(:logger, :handle_sasl_reports, false)
3642
Application.put_env(:logger, :handle_sasl_reports, true)
@@ -476,6 +482,15 @@ defmodule Logger.TranslatorTest do
476482
"""
477483
end
478484

485+
test "handles :undefined MFA properly" do
486+
children = [Supervisor.Spec.worker(MyTemporaryWorker, [], restart: :temporary)]
487+
opts = [strategy: :simple_one_for_one]
488+
{:ok, sup} = Supervisor.start_link(children, opts)
489+
assert capture_log(:info, fn ->
490+
{:error, {:badarith, _}} = Supervisor.start_child(sup, [])
491+
end) =~ "Start Call: Logger.TranslatorTest.MyTemporaryWorker.start_link/?"
492+
end
493+
479494
def task(parent, fun \\ (fn() -> raise "oops" end)) do
480495
Process.unlink(parent)
481496
receive do: (:go -> fun.())

0 commit comments

Comments
 (0)