vkryukov
LoggerBackends - SQL Logger backends functionality for Elixir v1.15+
Hi, I’ve created an SQL logger backend using LoggerBackends: GitHub - vkryukov/logger_backends_sql.
It safely stores all metadata and can be configured to use an existing Repo and/or Schema.
The simplest setup uses an SQLite3 database for logs:
# config/config.exs
config :logger, LoggerBackends.SQL,
level: :debug,
path: "./logs.sqlite"
Logs will be written to the logs table. You can also use an existing repo and customize the table name:
# config/config.exs
config :logger, LoggerBackends.SQL,
repo: MyApp.Repo,
table_name: "log_messages"
You can use your own Schema for log messages - just ensure the schema module defines a changeset/1 function that accepts time, message, and meta arguments.
Feedback welcome!
First Post!
vkryukov
While we are here, I would like people’s thoughts on the best way to configure the backend during the runtime.
LoggerBackends offers configure/2, which can be called like this:
LoggerBackends.configure(LoggerBackends.SQL,
option1: value1,
option2: value2,
...
)
and will send a :configure event to the backend that it can capture. The reference implementation for LoggerBackend.Console is here. This call will only succeed after a backend has already been added with LoggerBackend.add(LoggerBackends.SQL) (as someone needs to listen to these events).
However, you definitely want to set the path to a SQLite log database before adding the backend to perform all the initialization in the backend’s init function.
Something like this would be nice
LoggerBackends.add(LoggerBackends.SQL,
path: "./my.sqlite",
repo: nil
)
However, LoggerBackends.add/2 only processes the :flush option and ignores everything else.
So my current solution is to expose my own configure/1 to do the runtime config:
LoggerBackends.SQL.configure(
path: "./test1.sqlite",
repo: nil
)
LoggerBackends.add(LoggerBackends.SQL)
The previous option with LoggerBackend.add/2 is IMHO cleaner, but requires changing the existing contract.
Thoughts?







