Skip to content

Commit b7b7282

Browse files
josevalimJosé Valim
authored andcommitted
Optimize metadata merging and ensure no nil leakage (#7927)
Closes #7926 Signed-off-by: José Valim <[email protected]>
1 parent d3d1833 commit b7b7282

File tree

2 files changed

+21
-13
lines changed

2 files changed

+21
-13
lines changed

lib/logger/lib/logger.ex

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ defmodule Logger do
416416
@type backend :: :gen_event.handler()
417417
@type message :: IO.chardata() | String.Chars.t()
418418
@type level :: :error | :info | :warn | :debug
419-
@type metadata :: keyword(String.Chars.t())
419+
@type metadata :: keyword()
420420
@levels [:error, :info, :warn, :debug]
421421

422422
@metadata :logger_metadata
@@ -436,15 +436,23 @@ defmodule Logger do
436436
@spec metadata(metadata) :: :ok
437437
def metadata(keyword) do
438438
{enabled?, metadata} = __metadata__()
439+
Process.put(@metadata, {enabled?, into_metadata(keyword, metadata)})
440+
:ok
441+
end
439442

440-
metadata =
441-
Enum.reduce(keyword, metadata, fn
442-
{key, nil}, acc -> Keyword.delete(acc, key)
443-
{key, val}, acc -> Keyword.put(acc, key, val)
444-
end)
443+
defp into_metadata([], metadata), do: metadata
444+
defp into_metadata(keyword, metadata), do: into_metadata(keyword, [], metadata)
445445

446-
Process.put(@metadata, {enabled?, metadata})
447-
:ok
446+
defp into_metadata([{key, nil} | keyword], prepend, metadata) do
447+
into_metadata(keyword, prepend, :lists.keydelete(key, 1, metadata))
448+
end
449+
450+
defp into_metadata([{key, _} = pair | keyword], prepend, metadata) do
451+
into_metadata(keyword, [pair | prepend], :lists.keydelete(key, 1, metadata))
452+
end
453+
454+
defp into_metadata([], prepend, metadata) do
455+
prepend ++ metadata
448456
end
449457

450458
@doc """
@@ -671,7 +679,7 @@ defmodule Logger do
671679
@doc false
672680
def __do_log__({level, config, pdict}, chardata_or_fun, metadata) when is_list(metadata) do
673681
%{utc_log: utc_log?, truncate: truncate, mode: mode} = config
674-
metadata = [pid: self()] ++ Keyword.merge(pdict, metadata)
682+
metadata = [pid: self()] ++ into_metadata(metadata, pdict)
675683

676684
case normalize_message(chardata_or_fun, metadata) do
677685
{message, metadata} ->
@@ -851,7 +859,7 @@ defmodule Logger do
851859

852860
defp normalize_message(fun, metadata) when is_function(fun, 0) do
853861
case fun.() do
854-
{message, fun_metadata} -> {message, Keyword.merge(metadata, fun_metadata)}
862+
{message, fun_metadata} -> {message, into_metadata(fun_metadata, metadata)}
855863
:skip -> :skip
856864
message -> {message, metadata}
857865
end

lib/logger/test/logger_test.exs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,15 @@ defmodule LoggerTest do
109109

110110
assert capture_log(fn ->
111111
assert Logger.bare_log(:info, "ok", application: nil, module: LoggerTest) == :ok
112-
end) =~ msg("application= module=LoggerTest [info] ok")
112+
end) =~ msg("module=LoggerTest [info] ok")
113113
end
114114

115115
test "metadata compile-time merge" do
116116
assert Logger.metadata(module: Sample) == :ok
117117

118118
assert capture_log(fn ->
119119
assert Logger.log(:info, "ok", application: nil, module: CustomTest) == :ok
120-
end) =~ msg("application= module=CustomTest [info] ok")
120+
end) =~ msg("module=CustomTest [info] ok")
121121
end
122122

123123
test "metadata merge when the argument function returns metadata" do
@@ -127,7 +127,7 @@ defmodule LoggerTest do
127127

128128
assert capture_log(fn ->
129129
assert Logger.bare_log(:info, fun, application: nil, module: LoggerTest) == :ok
130-
end) =~ msg("application= module=Function [info] ok")
130+
end) =~ msg("module=Function [info] ok")
131131
end
132132

133133
test "enable/1 and disable/1" do

0 commit comments

Comments
 (0)