@@ -416,7 +416,7 @@ defmodule Logger do
416
416
@ type backend :: :gen_event . handler ( )
417
417
@ type message :: IO . chardata ( ) | String.Chars . t ( )
418
418
@ type level :: :error | :info | :warn | :debug
419
- @ type metadata :: keyword ( String.Chars . t ( ) )
419
+ @ type metadata :: keyword ( )
420
420
@ levels [ :error , :info , :warn , :debug ]
421
421
422
422
@ metadata :logger_metadata
@@ -436,15 +436,23 @@ defmodule Logger do
436
436
@ spec metadata ( metadata ) :: :ok
437
437
def metadata ( keyword ) do
438
438
{ enabled? , metadata } = __metadata__ ( )
439
+ Process . put ( @ metadata , { enabled? , into_metadata ( keyword , metadata ) } )
440
+ :ok
441
+ end
439
442
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 )
445
445
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
448
456
end
449
457
450
458
@ doc """
@@ -671,7 +679,7 @@ defmodule Logger do
671
679
@ doc false
672
680
def __do_log__ ( { level , config , pdict } , chardata_or_fun , metadata ) when is_list ( metadata ) do
673
681
% { 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 )
675
683
676
684
case normalize_message ( chardata_or_fun , metadata ) do
677
685
{ message , metadata } ->
@@ -851,7 +859,7 @@ defmodule Logger do
851
859
852
860
defp normalize_message ( fun , metadata ) when is_function ( fun , 0 ) do
853
861
case fun . ( ) do
854
- { message , fun_metadata } -> { message , Keyword . merge ( metadata , fun_metadata ) }
862
+ { message , fun_metadata } -> { message , into_metadata ( fun_metadata , metadata ) }
855
863
:skip -> :skip
856
864
message -> { message , metadata }
857
865
end
0 commit comments