Current section
Files
Jump to
Current section
Files
lib/eavesdropper_logger_backend.ex
defmodule EavesdropperLoggerBackend do
@behaviour :gen_event
@moduledoc """
A eavesdropper backend for `Logger`.
"""
require Logger
@base_config %{
name: __MODULE__,
level: :error,
truncate: 4096
}
def init(__MODULE__) do
{:ok, configure(__MODULE__, [])}
end
def handle_call({:configure, opts}, %{name: name} = state) do
{:ok, :ok, configure(name, opts, state)}
end
def handle_event(
{level, _groupleader, {Logger, message, timestamp, metadata}},
%{level: min_level, receiving_node: receiving_node, app_name: app_name} = state
) do
if should_log?(min_level, level) do
msg = %{
level: level,
message: message,
timestamp: timestamp,
metadata: metadata,
app_name: app_name
}
GenServer.cast(
{Eavesdropper.EavesdropperReceiver, :"#{receiving_node}"},
{:message_received, msg}
)
end
{:ok, state}
end
def handle_event(:flush, state) do
{:ok, state}
end
def handle_info(_msg, state) do
{:ok, state}
end
def terminate(_reason, _state) do
:ok
end
def code_change(_old, state, _extra) do
{:ok, state}
end
defp configure(name, opts) do
Application.get_env(:logger, name, [])
|> Keyword.merge(opts)
|> Enum.into(@base_config)
end
defp configure(_name, [level: new_level], state) do
Map.merge(state, %{level: new_level})
end
defp configure(_name, _opts, state), do: state
defp should_log?(nil, _lvl), do: true
defp should_log?(min, lvl) do
Logger.compare_levels(lvl, min) != :lt
end
end