elixir Logger for lists, tuples, etc

2020-08-09 06:32发布

问题:

I can use the elixir logger for inspecting strings

 > str = "string"
 > Logger.info "Here is a #{str}"
 [info] Here is a string

But when I log a list, it doesn't look pretty

 > list = [1,2,3,4,5]
 > Logger.info "Here is a list: #{list}"
 [info] Here is a list: ^A^B^C^D^E^F

When I log keyword list, it errors

 > kwl = [a: "apple", b: "banana"]
 > Logger.info "Here is a keyword list: #{kwl}"
   ** (ArgumentError) argument error
   (stdlib) :unicode.characters_to_binary([a: "apple", b: "banana"])
   (elixir) lib/list.ex:555: List.to_string/1

How do you logger lists, tuples and data types other than strings in Elixir?

回答1:

Your best bet is to use Logger.info "Here is some thing: #{inspect thing}". This way even if thing doesn't implement the String.Chars protocol, you still get something useful.



回答2:

If the goal is to temporarily print something to the console instead of explicitly "logging" it, you can directly use IO.inspect/2, instead of using inspect/2 in a Logger argument.

IO.inspect(params)

It pretty-prints by default and since it returns back the input, you can pipe it in an existing chain with a label, which is very helpful when debugging:

result =
  numbers
  |> IO.inspect(label: "Input list")
  |> Enum.filter(& rem(&1, 3) == 0)
  |> IO.inspect(label: "Filtered to multiples of 3")
  |> Enum.map(& &1 * &1)
  |> IO.inspect(label: "Numbers Squared")
  |> Enum.sum()