defmodule File.Only.Logger.Proxy.Try do @moduledoc """ Removes or adds the console backend. Keeps trying in case of failures. """ use PersistConfig alias File.Only.Logger.Log @after_compile get_env(:after_compile) @flush true @times 7 @wait 10 @doc """ Removes the console backend. If it fails, will retry up to #{@times} times. """ @spec remove_console_backend :: :ok | {:error, atom} def remove_console_backend do case Logger.remove_backend(:console, flush: @flush) do :ok -> :ok {:error, reason} -> :ok = Log.warn(:unremoved, {@wait, @times, reason, __ENV__}) remove_console_backend(@times) end end @doc """ Adds the console backend. If it fails, will retry up to #{@times} times. """ @spec add_console_backend :: :ok | {:error, atom} def add_console_backend do case Logger.add_backend(:console, flush: @flush) do {:ok, _pid} -> :ok {:error, reason} -> :ok = Log.warn(:unadded, {@wait, @times, reason, __ENV__}) add_console_backend(@times) end end ## Private functions @spec remove_console_backend(non_neg_integer) :: :ok | {:error, atom} defp remove_console_backend(0) do :ok = Log.warn(:remains_unremoved, {@wait, @times, __ENV__}) {:error, :console_unremoved} end defp remove_console_backend(times_left) do Process.sleep(@wait) times_left = times_left - 1 case Logger.remove_backend(:console, flush: @flush) do :ok -> :ok = Log.warn(:now_removed, {@wait, @times - times_left, __ENV__}) {:error, reason} -> :ok = Log.warn(:still_unremoved, {@wait, times_left, reason, __ENV__}) remove_console_backend(times_left) end end @spec add_console_backend(non_neg_integer) :: :ok | {:error, atom} defp add_console_backend(0) do :ok = Log.warn(:remains_unadded, {@wait, @times, __ENV__}) {:error, :console_unadded} end defp add_console_backend(times_left) do Process.sleep(@wait) times_left = times_left - 1 case Logger.add_backend(:console, flush: @flush) do {:ok, _pid} -> :ok = Log.warn(:now_added, {@wait, @times - times_left, __ENV__}) {:error, reason} -> :ok = Log.warn(:still_unadded, {@wait, times_left, reason, __ENV__}) add_console_backend(times_left) end end end