View Source Rivet.Utils.UniformLogFormat (rivet_utils v1.1.5)
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
Link to this section Summary
Functions
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) [ [' ', "key", 61, "42"], [' ', "file", 61, "narf"] ]
iex> format_msg([], %{}) []
Link to this section Functions
@spec format( level :: Logger.level(), message :: Logger.message(), timestamp :: Logger.Formatter.time(), 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) [ [' ', "key", 61, "42"], [' ', "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() " a=5 key=10 other=20"
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('a charlist', %{}) [' ', "a charlist"] iex> format_msg("a string", %{}) [' ', "a string"] iex> format_msg({:tuple}, %{}) [' ', "data=", "{:tuple}"]
#iex> format_msg({:tuple}, %{report_cb: fn x -> inspect(x) end}) #[' ', "{:tuple}"]