Reputation: 8065
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?
Upvotes: 30
Views: 7303
Reputation: 75820
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()
Upvotes: 2
Reputation: 9261
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.
Upvotes: 65