Provide custom log formatting that is friendly for both reading and indexing either via ELK or splunk.
https://surfingthe.cloud/uniform-log-format/
Contributor: Brandon Gillespie
Summary
Functions
@spec format( level :: Logger.level(), message :: Logger.message(), timestamp :: any(), metadata :: Keyword.t() ) :: IO.chardata()
iex> format_meta([a: 1, line: 10, b: 2, level: :info, c: 3], :info) |> IO.iodata_to_binary()
" a=1 b=2 c=3"
iex> format_meta([key: 10, line: 20, level: :debug], :info) |> IO.iodata_to_binary()
" key=10 level=debug"
iex> format_meta([module: Module.Thing], :debug) |> IO.iodata_to_binary()
" module=Module.Thing"
iex> format_meta([module: Module.Thing], :info)
[]
iex> format_meta([key: 42, module: :phoenix], :info) |> IO.iodata_to_binary()
" key=42"
iex> format_meta([key: 42, file: "narf"], :info) |> IO.iodata_to_binary()
" key=42"
iex> format_meta([key: 42, file: "narf"], :debug)
[
[~c" ", "key", 61, "42"],
[~c" ", "file", 61, "narf"]
]
iex> format_msg([], %{})
[]Dicts end up being alphabetic keys due to their nature:
iex> format_msg(%{key: 10, other: 20, a: 5}, %{}) |> IO.iodata_to_binary()
" other=20 a=5 key=10"Keyword lists will stay in-order:
iex> format_msg([key: 10, a: 5, other: 20], %{}) |> IO.iodata_to_binary()
" key=10 a=5 other=20"
iex> format_msg(~c"a charlist", %{})
[~c" ", "a charlist"]
iex> format_msg("a string", %{})
[~c" ", "a string"]
iex> format_msg({:tuple}, %{})
[~c" ", "data=", "{:tuple}"]