View Source Rivet.Utils.UniformLogFormat (rivet_utils v2.0.6)

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

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([], %{}) []

Functions

Link to this function

filter_meta(result, list, level)

View Source
Link to this function

format(level, msg, timestamp, meta)

View Source
@spec format(
  level :: Logger.level(),
  message :: Logger.message(),
  timestamp :: Logger.Formatter.time(),
  metadata :: Keyword.t()
) :: IO.chardata()
Link to this function

format_meta(meta, level)

View Source

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() " 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('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}"]