Skip to main content

lib/domain/shared/logging/internal_logging.ex

defmodule EcsElixirCore.Domain.Shared.InternalLogging do
  @moduledoc """
  Centralized internal logging for the ECS library.
  """

  require Logger

  @spec log_error(String.t(), module()) :: :ok
  def log_error(message, source) when is_binary(message) do
    emit("ERROR", message, source)
  end

  @spec log_warning(String.t(), module()) :: :ok
  def log_warning(message, source) when is_binary(message) do
    emit("WARNING", message, source)
  end

  @spec log_debug(String.t(), module()) :: :ok
  def log_debug(message, source) when is_binary(message) do
    emit("DEBUG", message, source)
  end

  defp emit(level, message, source) do
    json =
      Jason.encode!(%{
        level: level,
        message: message,
        source: inspect(source),
        timestamp: DateTime.utc_now() |> DateTime.to_iso8601()
      })

    case level do
      "ERROR" -> Logger.error(json)
      "WARNING" -> Logger.warning(json)
      _ -> Logger.debug(json)
    end

    :ok
  end
end