Skip to content

Commit 32e724c

Browse files
committed
Ensure logger formatter works with chardata, closes #14921
1 parent 7758084 commit 32e724c

File tree

2 files changed

+44
-12
lines changed

2 files changed

+44
-12
lines changed

lib/logger/lib/logger/formatter.ex

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -244,26 +244,38 @@ defmodule Logger.Formatter do
244244
case if(is_function(enabled, 0), do: enabled.(), else: enabled) do
245245
true ->
246246
color = md[:ansi_color] || Map.fetch!(colors, level)
247-
fragment = IO.ANSI.format_fragment(color, true)
248-
data = IO.iodata_to_binary(data)
249-
size = byte_size(data)
247+
[IO.ANSI.format_fragment(color, true), add_reset(data)]
250248

251-
cond do
252-
:binary.at(data, size - 2) == ?\r and :binary.at(data, size - 1) == ?\n ->
253-
[fragment, binary_part(data, 0, size - 2), IO.ANSI.reset() | "\r\n"]
249+
false ->
250+
data
251+
end
252+
end
254253

255-
:binary.at(data, size - 1) == ?\n ->
256-
[fragment, binary_part(data, 0, size - 1), IO.ANSI.reset(), ?\n]
254+
defp add_reset(binary) when is_binary(binary) do
255+
size = byte_size(binary)
257256

258-
true ->
259-
[fragment, data | IO.ANSI.reset()]
257+
cond do
258+
binary == "" ->
259+
IO.ANSI.reset()
260+
261+
:binary.at(binary, size - 1) == ?\n ->
262+
if size > 1 and :binary.at(binary, size - 2) == ?\r do
263+
[binary_part(binary, 0, size - 2), IO.ANSI.reset() | "\r\n"]
264+
else
265+
[binary_part(binary, 0, size - 1), IO.ANSI.reset(), ?\n]
260266
end
261267

262-
false ->
263-
data
268+
true ->
269+
[binary | IO.ANSI.reset()]
264270
end
265271
end
266272

273+
defp add_reset([?\r, ?\n]), do: [IO.ANSI.reset(), ?\r, ?\n]
274+
defp add_reset([?\n]), do: [IO.ANSI.reset(), ?\n]
275+
defp add_reset([last]), do: add_reset(last)
276+
defp add_reset([h | t]), do: [h | add_reset(t)]
277+
defp add_reset(rest), do: [rest | IO.ANSI.reset()]
278+
267279
@doc """
268280
Formats the message of a log event.
269281
"""

lib/logger/test/logger/formatter_test.exs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,14 @@ defmodule Logger.FormatterTest do
105105
colors: [enabled: true]
106106
)
107107

108+
assert %{level: :warning, msg: {:string, ""}, meta: %{}}
109+
|> format(formatter)
110+
|> IO.chardata_to_string() == "\e[33m\e[0m"
111+
112+
assert %{level: :warning, msg: {:string, "s"}, meta: %{}}
113+
|> format(formatter)
114+
|> IO.chardata_to_string() == "\e[33ms\e[0m"
115+
108116
assert %{level: :warning, msg: {:string, "message"}, meta: %{}}
109117
|> format(formatter)
110118
|> IO.chardata_to_string() == "\e[33mmessage\e[0m"
@@ -116,6 +124,18 @@ defmodule Logger.FormatterTest do
116124
assert %{level: :warning, msg: {:string, "message\r\n"}, meta: %{}}
117125
|> format(formatter)
118126
|> IO.chardata_to_string() == "\e[33mmessage\e[0m\r\n"
127+
128+
assert %{level: :warning, msg: {:string, [, ["message", [?\n]]]}, meta: %{}}
129+
|> format(formatter)
130+
|> IO.chardata_to_string() == "\e[33mémessage\e[0m\n"
131+
132+
assert %{level: :warning, msg: {:string, [, "message", ?\r, ?\n]}, meta: %{}}
133+
|> format(formatter)
134+
|> IO.chardata_to_string() == "\e[33mémessage\e[0m\r\n"
135+
136+
assert %{level: :warning, msg: {:string, [, "message" | "\r\n"]}, meta: %{}}
137+
|> format(formatter)
138+
|> IO.chardata_to_string() == "\e[33mémessage\e[0m\r\n"
119139
end
120140
end
121141

0 commit comments

Comments
 (0)