Packages

Easily ship structured logs and log based metrics to Betterstack with the Betterstack Logger backend.

Current section

Files

Jump to
betterstack_logger_backend lib betterstack_logger formatter.ex
Raw

lib/betterstack_logger/formatter.ex

defmodule BetterstackLogger.Formatter do
@moduledoc false
require Logger
alias BetterstackLogger.LogParams
alias BetterstackLogger.BackendConfig, as: Config
def format(level, message, ts, metadata) do
try do
LogParams.encode(ts, level, message, metadata)
rescue
e ->
%{
"timestamp" => NaiveDateTime.to_iso8601(NaiveDateTime.utc_now(), :extended) <> "Z",
"message" => "BetterstackLogger formatter error: #{inspect(e, safe: true)}",
"metadata" => %{
"formatter_error_params" => %{
"metadata" =>
inspect(metadata, safe: true, limit: :infinity, printable_limit: :infinity),
"timestamp" => inspect(ts),
"message" => inspect(message),
"level" => inspect(level)
},
"level" => "error"
}
}
end
end
def format_event(level, msg, ts, meta, %Config{metadata: :all}) do
format(level, msg, ts, Map.new(meta))
end
def format_event(level, msg, ts, meta, %Config{metadata: [drop: dropkeys]})
when is_list(dropkeys) do
meta =
meta
|> Enum.into(%{})
|> Map.drop(dropkeys)
format(level, msg, ts, meta)
end
def format_event(level, msg, ts, meta, %Config{metadata: metakeys}) when is_list(metakeys) do
IO.warn(
"Your betterstack_logger_backend configuration key `metadata` is deprecated. Looks like you're using a list of keywords. Please use `metadata: :all` or `metadata: [drop: [:keys, :to, :drop]]`"
)
format(level, msg, ts, Map.new(meta))
end
def format_event(_, _, _, _, nil) do
raise("BetterstackLogger is not configured!")
end
end