Telemetry
Since version v0.10.0, Redix uses Telemetry for instrumentation and for having an extensible way of doing logging. Telemetry is a metrics and instrumentation library for Erlang and Elixir applications that is based on publishing events through a common interface and attaching handlers to handle those events. For more information about the library itself, see its README.
Before version v0.10.0, Redix.start_link/1
and Redix.PubSub.start_link/1
supported a :log
option to control logging. For example, if you wanted to log disconnections at the :error
level and reconnections and the :debug
level, you would do:
Redix.start_link(log: [disconnection: :error, reconnection: :debug])
The :log
option is now deprecated in favour of either using the default Redix event handler or writing your own.
For information on the Telemetry events that Redix emits, see Redix.Telemetry
.
Writing your own handler
If you want control on how Redix events are logged or on what level they're logged at, you can use your own event handler. For example, you can create a module to handle these events:
defmodule MyApp.RedixTelemetryHandler do
require Logger
def handle_event([:redix, event], _measurements, metadata, _config) do
case event do
:disconnection ->
human_reason = Exception.message(metadata.reason)
Logger.warn("Disconnected from #{metadata.address}: #{human_reason}")
:failed_connection ->
human_reason = Exception.message(metadata.reason)
Logger.warn("Failed to connect to #{metadata.address}: #{human_reason}")
:reconnection ->
Logger.debug("Reconnected to #{metadata.address}")
end
end
end
Once you have a module like this, you can attach it when your application starts:
events = [
[:redix, :disconnection],
[:redix, :failed_connection],
[:redix, :reconnection]
]
:telemetry.attach_many(
"my-redix-log-handler",
events,
&MyApp.RedixTelemetryHandler.handle_event/4,
:config_not_needed_here
)