defmodule File.Only.Logger.Proxy do use PersistConfig require Logger @spec log(Logger.level(), String.t()) :: :ok def log(level, message), do: log(level, message, Logger.compare_levels(level, level())) @spec fun(Macro.Env.t(), integer | :infinity) :: String.t() def fun(%Macro.Env{} = env, limit) when is_integer(limit) or limit == :infinity do fun = fun(env) if String.length(fun) > limit, do: "\n #{fun}", else: fun end ## Private functions @spec fun(Macro.Env.t()) :: String.t() defp fun(%Macro.Env{function: {name, arity}, module: module}) do if to_string(name) |> String.contains?(" "), do: "#{inspect(module)}.'#{name}'/#{arity}", else: "#{inspect(module)}.#{name}/#{arity}" end defp fun(%Macro.Env{function: nil}), do: "'not inside a function'" @spec level :: Logger.level() | :all | :none defp level, do: get_env(:level, :all) @spec log(Logger.level(), String.t(), :lt | :eq | :gt) :: :ok defp log(level, message, compare) when compare in [:gt, :eq] do removed = case Logger.remove_backend(:console, flush: true) do :ok -> :ok error -> log(error) end :ok = Logger.log(level, message) if removed == :ok, do: Logger.add_backend(:console, flush: true) :ok end defp log(_level, _message, _compare), do: :ok @spec log(tuple) :: tuple defp log({:error, term} = error) do Logger.error(""" \nError calling 'Logger.remove_backend/2': • Error: #{inspect(term)} """) error end end