Rivet.Utils.UniformLogFormat (rivet_utils v2.7.0)

Copy Markdown View Source

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

data2txt(str)

filter_meta(result, list, level)

format(level, msg, timestamp, meta)

@spec format(
  level :: Logger.level(),
  message :: Logger.message(),
  timestamp :: any(),
  metadata :: Keyword.t()
) :: IO.chardata()

format_meta(meta, level)

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"]
]

format_msg(m, _)

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}"]