Current section

Files

Jump to
pagantis_elixir_tools lib multi_level_request_logger plug.ex
Raw

lib/multi_level_request_logger/plug.ex

defmodule ElixirTools.MultiLevelRequestLogger.Plug do
use Plug.Builder, init_mode: :runtime
require Logger
plug(Plug.Logger, builder_opts())
@type log_level :: :warn | :error | :info | :debug
@default_log_level :info
@allowed_log_levels [:warn, :error, :info, :debug]
@impl true
@spec init(Plug.opts()) :: Plug.opts()
def init(opts), do: opts
@impl true
def call(conn, _opts \\ []) do
log_level = conn |> Map.get(:request_path) |> log_level_for_path()
super(conn, log: log_level)
end
@spec log_level_for_path(String.t()) :: log_level
defp log_level_for_path(path) do
config = Application.get_env(:pagantis_elixir_tools, ElixirTools.MultiLevelRequestLogger)
path_log_levels = config[:path_log_level] || %{}
default_log_level = default_log_level(config)
log_level = Map.get(path_log_levels, path)
cond do
is_nil(log_level) ->
default_log_level
log_level not in @allowed_log_levels ->
Logger.warn("Invalid log level for #{path}. Using default (#{default_log_level})")
default_log_level
true ->
log_level
end
end
@spec log_level_for_path(map) :: log_level
defp default_log_level(config) do
configured_level = config[:default_log_level]
cond do
is_nil(configured_level) ->
@default_log_level
configured_level not in @allowed_log_levels ->
Logger.error("Wrong default log level configured in configuration. Using default.")
@default_log_level
true ->
configured_level
end
end
end