defmodule Util.LambdaLogger do @moduledoc """ Documentation for Logger. """ use Agent @doc """ Start Logger. `log_level` must be in `[:debug, :info, :warn, :error]` """ def start(log_level \\ :info) do Agent.start_link(fn -> log_level end, name: __MODULE__) end @doc """ Log Debug. """ def debug(message), do: if log?(:debug), do: log("[DEBUG] #{message |> log_message}") @doc """ Log Information. """ def info(message), do: if log?(:info), do: log("[INFO] #{message |> log_message}") @doc """ Log Warning. """ def warn(message), do: if log?(:warn), do: log("[WARN] #{message |> log_message}") @doc """ Log Error. """ def error(message), do: if log?(:error), do: log("[ERROR] #{message |> log_message}") defp log_message(message) when is_binary(message), do: message defp log_message(message), do: inspect(message) defp log(message), do: IO.puts(:stderr, message) defp log_level do Agent.get(__MODULE__, & &1) end defp log?(level) do level |> log?(log_level()) end defp log?(:debug, log_level) do case log_level do :debug -> true _ -> false end end defp log?(:info, log_level) do case log_level do :debug -> true :info -> true _ -> false end end defp log?(:warn, log_level) do case log_level do :debug -> true :info -> true :warn -> true _ -> false end end defp log?(:error, log_level) do case log_level do :debug -> true :info -> true :warn -> true :error -> true _ -> false end end end