ring_logger v0.7.0 RingLogger

This is an in-memory ring buffer backend for the Elixir Logger.

Install it by adding it to your config.exs:

use Mix.Config

# Add the RingLogger backend. This removes the
# default :console backend.
config :logger, backends: [RingLogger]

# Set the number of messages to hold in the circular buffer
config :logger, RingLogger, max_size: 1024

Or add manually:

Logger.add_backend(RingLogger)
Logger.configure(RingLogger, max_size: 1024)

Once added as a backend, you have two options depending on whether you're accessing the RingLogger via the IEx prompt or via code. If you're at the IEx prompt, use the helper methods in here like attach, detach, next, tail, grep, etc. They'll automate a few things behind the scenes. If you're writing a program that needs to get log messages, use get or start_link a RingLogger.Client and call its methods directly.

Link to this section Summary

Types

Option values used by client-side functions like attach and tail

A tuple holding a raw, unformatted log entry

Callback function for printing/paging tail, grep, and next output

Option values used by the ring logger

Functions

Attach the current IEx session to the logger. It will start printing log messages.

Callback implementation for c::gen_event.code_change/3.

Update the logger configuration.

Detach the current IEx session from the logger.

Helper method for formatting log messages per the current client's configuration.

Get n log messages starting at the specified index.

Run a regular expression on each entry in the log and print out the matchers.

Callback implementation for c::gen_event.handle_call/2.

Callback implementation for c::gen_event.handle_event/2.

Callback implementation for c::gen_event.handle_info/2.

Callback implementation for c::gen_event.init/1.

Print the next messages in the log.

Reset the index into the log for tail/1 to the oldest entry.

Save the contents of the log to the specified path

Print the last n messages in the log.

Callback implementation for c::gen_event.terminate/2.

Link to this section Types

Link to this type

client_option()
client_option() ::
  {:io, term()}
  | {:pager, pager_fun()}
  | {:color, term()}
  | {:metadata, Logger.metadata()}
  | {:format, String.t() | custom_formatter()}
  | {:level, Logger.level()}
  | {:module_levels, map()}

Option values used by client-side functions like attach and tail

A tuple holding a raw, unformatted log entry

Link to this type

pager_fun()
pager_fun() :: (IO.device(), iodata() -> :ok | {:error, term()})

Callback function for printing/paging tail, grep, and next output

Link to this type

server_option()
server_option() :: {:max_size, pos_integer()}

Option values used by the ring logger

Link to this section Functions

Link to this function

attach(opts \\ [])
attach([client_option()]) :: :ok

Attach the current IEx session to the logger. It will start printing log messages.

Options include:

  • :io - output location when printing. Defaults to :stdio
  • :colors - a keyword list of coloring options
  • :metadata - a keyword list of additional metadata
  • :format - the format message used to print logs
  • :level - the minimum log level to report by this backend. Note that the :logger application's :level setting filters log messages prior to RingLogger.
  • :module_levels - a map of log level overrides per module. For example, %{MyModule => :error, MyOtherModule => :none}
Link to this function

code_change(old_vsn, state, extra)

Callback implementation for c::gen_event.code_change/3.

Link to this function

configure(opts)
configure([server_option()]) :: :ok

Update the logger configuration.

Options include:

  • :max_size - the max number of log messages to store at a time
Link to this function

detach()
detach() :: :ok

Detach the current IEx session from the logger.

Link to this function

format(message)
format(entry()) :: :ok

Helper method for formatting log messages per the current client's configuration.

Link to this function

get(index \\ 0, n \\ 0)

Get n log messages starting at the specified index.

Set n to 0 to get entries to the end

Link to this function

grep(regex_or_string, opts \\ [])
grep(Regex.t() | String.t(), [client_option()]) :: :ok | {:error, term()}

Run a regular expression on each entry in the log and print out the matchers.

For example:

iex> RingLogger.grep(~r/something/) :ok

Options include:

  • Options from attach/1
  • :pager - a function for printing log messages to the console. Defaults to IO.binwrite/2.
Link to this function

handle_call(arg, state)

Callback implementation for c::gen_event.handle_call/2.

Link to this function

handle_event(arg1, state)

Callback implementation for c::gen_event.handle_event/2.

Link to this function

handle_info(_, state)

Callback implementation for c::gen_event.handle_info/2.

Link to this function

init(arg1)
init(module()) :: {:ok, term()} | {:error, term()}
init({module(), list()}) :: {:ok, term()} | {:error, term()}

Callback implementation for c::gen_event.init/1.

Link to this function

next(opts \\ [])
next([client_option()]) :: :ok | {:error, term()}

Print the next messages in the log.

Options include:

  • Options from attach/1
  • :pager - a function for printing log messages to the console. Defaults to IO.binwrite/2.
Link to this function

reset(opts \\ [])
reset([client_option()]) :: :ok | {:error, term()}

Reset the index into the log for tail/1 to the oldest entry.

Link to this function

save(path)
save(Path.t()) :: :ok | {:error, term()}

Save the contents of the log to the specified path

The file is overwritten if it already exists. Log message formatting is done similarly to other RingLogger calls.

Print the last n messages in the log.

Options include:

  • Options from attach/1
  • :pager - a function for printing log messages to the console. Defaults to IO.binwrite/2.
Link to this function

tail(n, opts)
tail(non_neg_integer(), [client_option()]) :: :ok | {:error, term()}

Link to this function

terminate(reason, state)

Callback implementation for c::gen_event.terminate/2.