lib/file/only/logger/app.ex

defmodule File.Only.Logger.App do
  use Application

  @spec start(Application.start_type(), term) :: {:ok, pid}
  def start(_start_type, :ok = _start_args) do
    :logger.get_handler_config(:debug_handler) |> dbg()
    {:ok, default} = :logger.get_handler_config(:default)
    default.level |> dbg()

    # Prevent console messages...
    :ok = :logger.set_handler_config(:default, :level, :none)

    :logger.get_handler_config(:debug_handler) |> dbg()
    {:ok, default} = :logger.get_handler_config(:default)
    default.level |> dbg()

    # Add debug, info, warning and error handlers...
    case Logger.add_handlers(:file_only_logger) do
      :ok ->
        # Allow console messages...
        :ok = :logger.set_handler_config(:default, :level, Logger.level())

        {:ok, debug} = :logger.get_handler_config(:debug_handler)
        {:ok, default} = :logger.get_handler_config(:default)
        [debug.config.file, default.level] |> dbg()

        {:ok, self()}

      # Likely due to compile time configuration in map_sorter...
      # Will log error message ==> Invalid logger handler config:
      # {:file_only_logger, {:already_exist, :debug_handler}}
      {:error,
       {:bad_config, {:handler, {:file_only_logger, {:already_exist, _id}}}}} ->
        # Allow console messages...
        :ok = :logger.set_handler_config(:default, :level, Logger.level())

        {:ok, debug} = :logger.get_handler_config(:debug_handler)
        {:ok, default} = :logger.get_handler_config(:default)
        [debug.config.file, default.level] |> dbg()

        {:ok, self()}
    end
  end
end