LoggerEtsBackend
A simple Logger backend which writes log entries to an ETS table.
It does not create or manage the table for you; you must do this
external to the logging app.
LoggerEtsBackend borrows heavily from LoggerFileBackend, and
therefore acts much the same way.
Rationale
The primary use-case for this backend is not for persistent logs,
but for temporary logs that may need to be inspected at run-time by
the system itself. By pushing log messages to an ETS table, data can
be quickly searched using match_specs based on message contents or
the metadata stored along with the entry.
Configuration
LoggerEtsBackend is a custom backend for the elixir :logger
application. This backend can only log to a single ETS table, so there
must be one :logger backend configured for each log file we
need. Each backend has a name like {LoggerEtsBackend, id}, where
id is any elixir term (usually an atom).
Note: tables use for logging are recommented to be configured with
the :ordered_set and :public options.
Configuration Example
config :logger,
backends: [{LoggerEtsBackend, :inspection_log}]
# configuration for the {LoggerEtsBackend, :critical_log} backend
config :logger, :critical_log,
table: :critical_table,
level: :error
Usage
LoggerEtsBackend supports the following configuration values:
table- the table name to push log tuples tolevel- the logging level for the backendmetadata- the metadata to includemetadata_filter- metadata terms which must be present in order to log
Note: It is recommended that metadata_filter is set for this
backend, to ensure only a small subset of log entries are captured.
Examples
Runtime configuration
# some process starts an ets table
:ets.new(:debug_messages, [:ordered_set, :public, :named_table])
...
Logger.add_backend {LoggerFileBackend, :debug}
Logger.configure_backend {LoggerFileBackend, :debug},
table: :debug_messages,
metadata: ...,
metadata_filter: ...
Application config for multiple log files
config :logger,
backends: [{LoggerEtsBackend, :info},
{LoggerEtsBackend, :error}]
config :logger, :info,
table: :info_messages,
level: :info
config :logger, :error,
table: :error_messages,
level: :error
Filter out metadata
This example removes all the default metadata and only keeps the
:module name which issued the log message.
config :logger,
backends: [{LoggerEtsBackend, :info}]
config :logger, :info,
table: :info_messages,
level: :info,
metadata: [application: :ui]
Filtering logging by specifying metadata terms
This example only logs :info statements originating from the :ui
OTP app. The :application metadata key is auto-populated by
Logger.
config :logger,
backends: [{LoggerEtsBackend, :ui}]
config :logger, :ui,
table: :ui_messages,
level: :info,
metadata_filter: [application: :ui]