Packages

An elixir log forwarding library

Current section

Files

Jump to
eavesdropper lib eavesdropper_receiver.ex
Raw

lib/eavesdropper_receiver.ex

defmodule Eavesdropper.EavesdropperReceiver do
use GenServer
require Logger
alias Logger.Formatter
# Client
def start_link(default) when is_list(default) do
GenServer.start_link(__MODULE__, default, name: __MODULE__)
end
# Server
@impl true
def init(initial_state) do
{:ok, configure(initial_state)}
end
def get_state() do
GenServer.call(__MODULE__, :get_state)
end
@impl true
def handle_cast({:message_received, msg}, [forward: true, receiver: receiver] = state) do
GenServer.cast(receiver, {:message_received, msg})
{:noreply, state}
end
@impl true
def handle_cast({:message_received, %{level: :info} = params}, state) do
params
|> format_msg()
|> Logger.info()
{:noreply, state}
end
def handle_cast({:message_received, %{level: :debug} = params}, state) do
params
|> format_msg()
|> Logger.debug()
{:noreply, state}
end
def handle_cast({:message_received, %{level: :warn} = params}, state) do
params
|> format_msg()
|> Logger.warn()
{:noreply, state}
end
def handle_cast({:message_received, %{level: :error} = params}, state) do
params
|> format_msg()
|> Logger.error()
{:noreply, state}
end
@impl true
def handle_call(:get_state, _pid, state) do
{:reply, state, state}
end
defp format_msg(%{message: message, app_name: app_name, timestamp: {date, time}}) do
dt_date = Formatter.format_date(date)
dt_time = Formatter.format_time(time)
"#{app_name} - #{dt_date}T#{dt_time}Z: #{message}"
end
def configure(params) do
Application.get_all_env(:eavesdropper)
|> Keyword.merge(params)
end
end