@@ -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
0 commit comments