defmodule Crawly.Loggers.SendToUiBackend do
# TODO: Write doc
# Initialize the configuration
def init({__MODULE__, name}) do
{:ok, configure(name, [])}
end
def handle_call({:configure, opts}, %{name: name} = state) do
{:ok, :ok, configure(name, opts, state)}
end
# Handle the flush event
def handle_event(:flush, state) do
{:ok, state}
end
# Handle any log messages that are sent across
def handle_event(
{_level, _group_leader, {Logger, message, _timestamp, metadata}},
%{destination: {node, module, function}} = state
) do
{mod, _fun, _arity} = Keyword.get(metadata, :mfa, {:undefined, nil, nil})
case Keyword.get(metadata, :crawl_id, nil) do
nil ->
:ignore
crawl_id ->
:rpc.cast(node, module, function, [
crawl_id,
message,
Atom.to_string(mod)
])
end
{:ok, state}
end
defp configure(name, []) do
case Application.get_env(:logger, name, []) do
[] ->
raise "Destination was not configured"
config ->
%{name: name, destination: Keyword.get(config, :destination)}
end
end
# We don't support any re-configuration so far
defp configure(_name, _opts, state), do: state
end